我正在使用php的preg_replace函数,我有以下正则表达式:
(?:[^>(),]+)
匹配除>(),
之外的任何字符。问题是我想确保其中至少有一个字母(\w
)且匹配不为空,我该怎么做?
有没有办法在[^>(),]+
部分说出我想要匹配的内容?
答案 0 :(得分:1)
您可以添加lookahead assertion:
(?:(?=.*\p{L})[^>(),]+)
这可确保字符串中的某处至少有一个字母(\p{L}
; \w
也匹配数字和下划线。
但是,您并不需要(?:...)
非捕获括号:
(?=.*\p{L})[^>(),]+
同样适用。另外,为了确保我们始终匹配整个字符串,最好用锚点包围正则表达式:
^(?=.*\p{L})[^>(),]+$
编辑:
对于在比赛中不包括周围空白的附加要求,事情会变得复杂一些。尝试
^(?=.*\p{L})(\s*)((?:(?!\s*$)[^>(),])+)(\s*)$
在PHP中,例如,用REPLACEMENT
替换我们找到的所有字符串,只留下前导和尾随空格,这可能如下所示:
$result = preg_replace(
'/^ # Start of string
(?=.*\p{L}) # Assert that there is at least one letter
(\s*) # Match and capture optional leading whitespace (--> \1)
( # Match and capture... (--> \2)
(?: # ...at least one character of the following:
(?!\s*$) # (unless it is part of trailing whitespace)
[^>(),] # any character except >(),
)+ # End of repeating group
) # End of capturing group
(\s*) # Match and capture optional trailing whitespace (--> \3)
$ # End of string
/xu',
'\1REPLACEMENT\3', $subject);
答案 1 :(得分:0)
您只需在\w
内“插入”(?:[^>(),]+\w[^>(),]+)
即可。所以它至少会有一个字母,显然不是空的。 BTW \w
捕获数字和字母。如果您只想要字母,则可以使用unicode字母字符类\p{L}
而不是\w
。
答案 2 :(得分:0)
这个怎么样:
(?:[^>(),]*\w[^>(),]*)