Regex: смотреть вперед и смотреть назад, проверяя. (точка) для использования в качестве десятичной или полной остановки - PullRequest
6 голосов
/ 10 ноября 2011

Я хорошо осмотрел сеть, чтобы найти ответ на этот вопрос, но не могу заставить его работать.

Я разработал следующее регулярное выражение:

    (?<![^\d][\\])[\.](?![\d])

Цель состоит в том, чтобы идентифицировать любое «.» (точки), которые не были экранированы или являются частью десятичного числа.

т)

  • abc.co.uk, обе точки должны совпадать
  • ab0.co.uk, обе точки должны совпадать
  • abc.0.uk, обе точки должны совпадать
  • abc \ .co.uk, сопоставляется только вторая точка
  • 0,00, точка НЕ ​​должна совпадать
  • abc0.0.uk, первая точка НЕ ​​будет соответствовать (что является приемлемым результатом), вторая точка должна

На данный момент это работает для всех случаев выше, кроме:

  • abc.0.uk, обе точки должны совпадать

Есть мысли? Похоже, что предварительный просмотр работает правильно, однако предварительный просмотр - нет.

Уверен, это будет легко для любого гуру Regex!

FYI. Я разрабатываю это в .net 4

Ответы [ 2 ]

6 голосов
/ 10 ноября 2011

Попробуйте это

(?<![\\\d])\.(?=\d)|(?<=[^\D\\])\.(?!\d)|(?<=[^\d\\])\.(?!\d)

Посмотрите это здесь на Regexr

Я разбил его в три этапа.

  1. Соответствует, если перед не является escape-символом, а не цифрой, а сзади является цифрой.

  2. Соответствует, если перед не является escape-символом, а цифра и сзади не является цифрой

  3. Соответствует, если перед не является escape-символом и не цифрой, а сзади не является цифрой

0 голосов
/ 10 ноября 2011

Разделите задачу на 2. Сначала проверьте, является ли строка числом или нет [^.\d].На втором этапе выберите из оставшихся точек без escape-символа.Этот подход намного проще.

Regex из другого ответа не охватывает все случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...