正则表达式:如何匹配不以特定字符结尾的单词

时间:2011-11-18 11:04:58

标签: php regex numbers word match

我想匹配整个“单词” - 一个以数字字符开头并且可能包含特殊字符但不以'%'结尾的单词。

匹配这些:

  • 112(整数)
  • 10-12(范围)
  • 11/2(分数)
  • 11.2(十进制数字)
  • 1,200(千位分隔符)

但不是

  • 12%(百分比)
  • A38(以字母字母开头的字样)

我尝试过这些正则表达式:

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

但在“12%”中返回“12%”

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

但在'12%'中返回'12'

我可以对忽视\S的{​​{1}}字词例外吗? 或者还得做点其他事情?

我将在PHP中使用它,但只需按照您的意愿编写,我将其转换为PHP。

7 个答案:

答案 0 :(得分:7)

这符合您的规范:

\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 %

possessive quantifier \S*+确保正则表达式引擎不会回溯到已匹配的非空格字符串。因此,它不会“回复”%以匹配12中的12%

当然,这也会匹配1!abc,因此您可能希望比\S更具体,它匹配任何不是空白字符的内容。

答案 1 :(得分:1)

  

我可以对忽视%

的\ S术语做例外

是的,你可以:

[^%\s]

请参阅此表达式\b\d[^%\s]* here on Regexr

答案 2 :(得分:1)

KISS(限制性):

/[0-9][0-9.,-/]*\s/

答案 3 :(得分:1)

\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)

答案 4 :(得分:0)

尝试这个

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

答案 5 :(得分:0)

试试这个PCRE正则表达式:

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

它应该能满足您的需求。

答案 6 :(得分:0)

我建议只是:

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

关于小数分隔符或范围,这不是很准确。 (例如)。但是++占有量词会尽可能多地占用小数。因此,您只需要通过简单的断言来检查以下字符。是否适用于您的示例。