Разбор чисел из текста с использованием регулярных выражений - PullRequest
0 голосов
/ 26 марта 2011

Мне нужно регулярное выражение (идеально совместимое с PHP), которое находит все числа, которым предшествует граница, знак равенства (=) или двоеточие (:), но игнорирует проценты (цифры, сопровождаемые знаком%), раз даты и символьные номера ISO 8859-1 (например,  ).

Использовал следующее, но оно не работает каждый раз:

/(^:|\b|=|^&)([0-9]*[0-9.]*[0-9]+)(^%:;)?

1 Ответ

1 голос
/ 28 марта 2011

Ваше регулярное выражение серьезно нарушено:

  • Похоже, вы используете символ вставки (^) как "не" - он имеет значение только внутри классов символов; в другом месте это означает «начало ввода».
  • Ваша точка должна быть экранирована, или она будет соответствовать любому символу.
  • Число, которому предшествует знак равенства или двоеточие, всегда начинается с границы (как = и: не \ w, а цифры) - поэтому необходим только \ b.

Я настоятельно рекомендую прочитать хороший справочник по регулярным выражениям - "man perlre" был моим источником много лет назад, но я уверен, что сейчас есть и лучшие.

Следующее должно делать то, что вы хотите, предполагая, что числа начинаются и заканчиваются на границе, не имеют разделителей тысяч и используют точку в качестве десятичного разделителя, что времена и даты являются последовательностями чисел, разделенных ":", " - ", или" / ", и что такими последовательностями чисел являются время и дата. Это должно быть легко улучшить, если эти предположения не верны.

/\b(?<!&#|\d[:\/-])(\d+(?:\.\d+)?)(?!%|[:\/-]\d)\b/

Пояснение:

  • (? <! ...) негативное оглядывание, исключая все, что вы не хотите видеть ДО ваших номеров. </li>
  • (\ d + (?:. \ D +)?) Число с целой и десятичной частью, захватывая только одну группу
  • (?! ...) отрицательный прогноз, исключая все, что вы не хотите видеть ПОСЛЕ ваших номеров.

Заметьте, я также предполагаю, что у вас нет цифр, начинающихся с "& #", но за которыми не следует ";". Кодирование вашего регулярного выражения, если это предположение не выполняется, является более сложной проблемой.

Тест:

$ pcretest
PCRE version 7.8 2008-09-05

  re> /\b(?<!&#|\d[:\/-])(\d+(?:\.\d+)?)(?!%|[:\/-]\d)\b/g
data> a12
No match
data> a 12
 0: 12
 1: 12
data> 12-12
No match
data> 12:12
No match
data> 12 23
 0: 12
 1: 12
 0: 23
 1: 23
data> &#12
No match
data> :12
 0: 12
 1: 12
data> =12
 0: 12
 1: 12
data> 12/12
No match
data> 12%
No match
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...