正则表达式突出显示错误的字词Hell«o»
并忽略正确的字词«Hello»
或Hello
,
所以,我的问题是我的JavaScript代码工作正常,但当我尝试它的PHP它也突出显示字符串,不应该:
这是我的正则表达式:https://regex101.com/r/SqCR1y/14
PHP代码:
$re = '/^(?:.*[[{(«][^\]})»\n]*|[^[{(«\n]*[\]})»].*|.*\w[[{(«].*|.*[\]})»]\w.*)$/m';
$str = '«This is the point of sale»';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
//输出
array(1) {
[0]=>
array(1) {
[0]=>
string(29) "«This is the point of sale»"
}
}
预期:空数组
jsfiddle在这里,工作正常
提前致谢
答案 0 :(得分:1)
您没有使用正确的模式。试试这个:
$re = '/^
(?:
\([^)\n] | [^(\n]*\). |
\[[^]\n] | [^[\n]*\]. |
{[^}\n] | [^{\n]}.* |
«[^»\n] | [^«\n]*». |
.?\w[[{(«]. | .?[\]})»]\w.
)
$/mxu';
答案 1 :(得分:0)
像“(不)平衡”字符串怎么样?这应该合法吗?
此类型的模式在您的测试输入中并不明确,但由于您的“好”字符串都不均衡,您可以考虑使用regex recursion来匹配平衡括号表达式并定位有效的字符串而不是无效字符串:
$re = '/
^
(?!.*\w[{}«»\(\)\[\]]\w) //disallow brackets inside words
(?:
[^\n{}«»\(\)\[\]]| //non bracket character, OR:
( //(capture group #1, the recursive subpattern) "one of the following balanced groups":
(\((?:(?>[^\n«»\(\){}\[\]]|(?1))*)\))| //balanced paren groups
(\[(?:(?>[^\n«»\(\){}\[\]]|(?1))*)\])| //balanced bracket groups
(«(?:(?>[^\n«»\(\){}\[\]]|(?1))*)»)| //balanced chevron groups
({(?:(?>[^\n«»\(\){}\[\]]|(?1))*)}) //balanced curly bracket groups
)
)+ //repeat "non bracket character or balanced group" until end of string
$
/mxu';
递归采用以下形式:
[openbracket]([nonbracket] | [open/close pattern again via recursion])*[closebracket]
要以递归方式使用部分模式,您可以通过包含它的捕获组(?N)
来识别它,其中N是组的编号。
*在进入递归之前,最初的否定前瞻将导致任何“字边界”违规失败
*此正则表达式看起来比原始方法快35%,如下所示:https://regex101.com/r/MBITHe/4