RegEx :/@{0,1}\s*x(.*?)x\s*@{0,1}/
我试图强制使用的语法是xSomethingx
和@xSomethingx@
,@
中允许使用空格,但没有captured
时@
}的
应匹配:
@ xSomethingx @
=> @ xSomethingx @
. xSomethingx .
=> xSomethingx
到目前为止我尝试了什么:
我已经尝试了很多looksaheads
和lookbehinds
positive
和negative
,但我只能将其归结为match
而我不想在某种情况下capture spaces
。我也用non-capturing groups
玩了一下。
这里有指针吗?如果需要,可以澄清更多。
答案 0 :(得分:2)
这个也适合你:
(?:@\s*)?x(?:.*)x(?:\s*@)?
-
'@ xSomethingx @' ; // @ xSomethingx @
'. xSomethingx .'; // xSomethingx
它与Sahil Gulati的正则表达式略有不同,但它基本上会执行相同的匹配。
答案 1 :(得分:1)
正则表达式:(?:@\s*|)x(?:.*?)x(?:\s*@|)
<?php
$pattern="/(?:@\s*|)x(?:.*?)x(?:\s*@|)/";
preg_match($pattern, "@xsomethingx@",$matches1);
preg_match($pattern, "@ xSomethingx @",$matches2);
preg_match($pattern, ". xSomethingx .",$matches3);
print_r($matches1);
print_r($matches2);
print_r($matches3);
<强>输出:强>
Array
(
[0] => @xsomethingx@
)
Array
(
[0] => @ xSomethingx @
)
Array
(
[0] => xSomethingx
)
答案 2 :(得分:0)
以下是适合您的最佳答案/模式:/(?:@ *)?x.*x(?: *@)?/
这会处理你的字符串几乎是Sahil的的两倍,因为他的模式错误地使用了管道和一个不必要的捕获组。你会看到我在点上使用了一个贪婪的量词(如Eduardo),因为如果子串中有x
,那么该模式将不会捕获整个预期的字符串 - 这是一个潜在的失败在Sahil的模式中。
Pattern Demo(插入Sahil的模式,看看它是如何无法完全匹配其中一个字符串的。)
但是,我想指出此页面上的所有答案都未能验证捕获的字符串是否在开始时结束。我的意思是,看看我的正则表达式演示,@xsome@thingx
并不以@
结尾,但它确实从它开始。要正确识别这些事件,必须设计更广泛的模式。如果这是您/您的项目的问题,那么您应该在您的问题中澄清这一点,以便可以根据需要更新答案。