我一直在摸索这一点,并且认为我会把它交给正则表达专家:
我想匹配这样的字符串:
abc[abcde]fff
abcffasd
所以我想允许单括号(例如[
或]
)。但是,我不想按顺序允许双括号(例如[[
或]]
)。
这意味着此字符串不应传递正则表达式:
abc[abcde]fff[[gg]]
到目前为止,我最好的猜测是基于an example I found,例如:
(?>[a-zA-Z\[\]']+)(?!\[\[)
然而,这不起作用(即使存在双括号也匹配),可能是因为括号也包含在第一部分中。
答案 0 :(得分:2)
不要被吓倒!
^(?:(?:[a-z]+)|(?:\](?!\]))|(?:\[(?!\[)))+$
我删除了仅有的两件或更多件事。我删除了只有一个字符的冗余字符类。这似乎通过了我能想到的所有测试用例。任何字符串只包含单个[
或]
。
让我知道它是否适合你!
我不确定我能回答这个问题,但是我会发布我所拥有的内容。
首先,我有这个似乎没有括号匹配。这是任何不被其中2个或更多的字母写的字母。
^(?:([a-z])(?!\1{2,}))+$
我们可以将括号添加到字符类中,它将开始匹配括号;但是,显然它也会允许它们遵循与字母相同的规则(两个一起有效)。我们如何将括号行为与字母行为分开?
^(?:([a-z\[\]])(?!\1{2,}))+$
这感觉很脏,但似乎有效。看看另一个答案,我更喜欢这个。现在弄清楚为什么我没有想到它。
^(?:(?:([a-z])(?!\1{2,}))|(?:[\]](?![\]]))|(?:[\[](?![\[])))+$
另外,出于某种原因,我认为每个角色只有1-2个,但只有[
和]
中的一个,所以无论如何这都是毫无价值的:)。
答案 1 :(得分:2)
你想要这样的东西:
^(?:\[?[^\[]|\[$)*$
在每个字符处,模式接受一个左括号,后跟另一个字符或字符串的结尾。
或者更整洁一点,使用negative lookahead:
^(?:(?!\[\[).)*$
此处,只要前方没有看到两个[[
,模式才会匹配字符。
答案 2 :(得分:2)
你可以尝试这种消极的前瞻:
$arr = array('abc[abcde]fff', 'abcffasd', 'abc[abcde]fff[[gg]]');
foreach ($arr as $str) {
echo $str,' => ';
$ret = preg_match('/^(?!.*?(\[\[)).+$/', $str, $m);
echo "$ret\n";
}
abc[abcde]fff => 1
abcffasd => 1
abc[abcde]fff[[gg]] => 0
答案 3 :(得分:0)
此正则表达式应允许除两个连续括号外的所有字母和括号(即[],[[或]])
([a-zA-Z\[\]][a-zA-Z])+
编辑:对不起,这对于奇数长度的字符串
不起作用