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

bon*_*nna 5 php regex numbers cpu-word match

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

匹配这些:

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

但不是

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

我试过这些正则表达式:

(\b\p{N}\S)*)
Run Code Online (Sandbox Code Playgroud)

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

(\b\p{N}(?:(?!%)\S)*)
Run Code Online (Sandbox Code Playgroud)

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

我可以对\S无视的术语作出例外%吗?或者还要做别的事吗?

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

Tim*_*ker 7

这符合您的规格:

\b\p{N}\S*+(?<!%)
Run Code Online (Sandbox Code Playgroud)

说明:

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

占有欲量词 \S*+可以确保正则表达式引擎不会回溯到它已经匹配的非空格字符的字符串.因此,它不会"回馈"a %匹配1212%.

当然,这也会匹配1!abc,所以你可能希望更具体,而不是\S匹配任何不是空白字符的东西.

  • +1,但如果你使`\ S*`占有 - - \S*+` - 你可以摆脱`(?=\s | $)`. (3认同)