Regex: как подобрать слово, которое не заканчивается конкретным символом - PullRequest
5 голосов
/ 18 ноября 2011

Я хотел бы сопоставить целое «слово» - то, которое начинается с цифры и может включать специальные символы, но не заканчивается на «%».

Соответствует этим:

  • 112 (целые числа)
  • 10-12 (диапазоны)
  • 11/2 (дроби)
  • 11,2 (десятичные числа)
  • 1200 (разделитель тысяч)

, но не

  • 12% (проценты)
  • A38 (слова, начинающиеся с буквенного символа)

Я пробовал эти регулярные выражения:

(\b\p{N}\S)*)

, но это возвращает '12% 'в '12%'

(\b\p{N}(?:(?!%)\S)*)

, но это возвращает '12' в'12% '

Могу ли я сделать исключение из термина \S, который игнорирует %?Или придется делать что-то еще?

Я буду использовать это в PHP, но просто напишите, как вы хотите, и я конвертирую это в PHP.

Ответы [ 7 ]

7 голосов
/ 18 ноября 2011

Это соответствует вашей спецификации:

\b\p{N}\S*+(?<!%)

Пояснение:

\b       # Start of number
\p{N}    # One Digit
\S*+     # Any number of non-space characters, match possessively
(?<!%)   # Last character must not be a %

Собственный квантификатор \S*+ гарантирует, что механизм регулярных выражений не будет возвращаться к строке непробельных символов, с которыми он уже сопоставлен. Следовательно, он не «отдаст» % для сопоставления 12 в пределах 12%.

Конечно, это также будет соответствовать 1!abc, поэтому вы можете захотеть быть более конкретным, чем \S, который соответствует всему, что не является пробельным символом.

1 голос
/ 18 ноября 2011
\d+([-/\.,]\d+)?(?!%)

Объяснение:

\d+        one or more digits
(
   [-/\.,]     one "-", "/", "." or ","
   \d+         one or more digits
)?         the group above zero or one times
(?!%)      not followed by a "%" (negative lookahead)
1 голос
/ 18 ноября 2011

ПОЦЕЛУЙ (ограничительный):

/[0-9][0-9.,-/]*\s/
1 голос
/ 18 ноября 2011

Могу ли я сделать исключение из термина \ S, который игнорирует%

Да, вы можете:

[^%\s]

См. Это выражение \b\d[^%\s]* здесь на Regexr

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

Я бы предложил просто:

(\b[\p{N},.-]++(?!%))

Это не очень точно в отношении десятичных разделителей или диапазонов. (Как пример). Но собственнический квантификатор ++ съест столько знаков после запятой, сколько сможет. Так что вам действительно нужно проверить следующий символ с простым утверждением. Работал на ваших примерах.

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

Попробуйте это регулярное выражение PCRE:

/^(\d[^%]+)$/

Это должно дать вам то, что вам нужно.

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

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

preg_match("/^[0-9].*[^%]$/", $string);
...