我想匹配整个“单词” - 一个以数字字符开头并且可能包含特殊字符但不以'%'结尾的单词。
匹配这些:
但不是
我尝试过这些正则表达式:
(\b\p{N}\S)*)
但在“12%”中返回“12%”
(\b\p{N}(?:(?!%)\S)*)
但在'12%'中返回'12'
我可以对忽视\S
的{{1}}字词例外吗?
或者还得做点其他事情?
我将在PHP中使用它,但只需按照您的意愿编写,我将其转换为PHP。
答案 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)
答案 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},.-]++(?!%))
关于小数分隔符或范围,这不是很准确。 (例如)。但是++
占有量词会尽可能多地占用小数。因此,您只需要通过简单的断言来检查以下字符。是否适用于您的示例。