只有在'character`

时间:2017-03-26 15:54:54

标签: php regex pcre

RegEx /@{0,1}\s*x(.*?)x\s*@{0,1}/

我试图强制使用的语法是xSomethingx@xSomethingx@@中允许使用空格,但没有captured@ }的

应匹配:

@ xSomethingx @ => @ xSomethingx @

. xSomethingx . => xSomethingx

到目前为止我尝试了什么: 我已经尝试了很多looksaheadslookbehinds positivenegative,但我只能将其归结为match而我不想在某种情况下capture spaces。我也用non-capturing groups玩了一下。

这里有指针吗?如果需要,可以澄清更多。

3 个答案:

答案 0 :(得分:2)

这个也适合你:

(?:@\s*)?x(?:.*)x(?:\s*@)?

-

'@         xSomethingx  @'                  ; // @         xSomethingx  @
'.            xSomethingx                 .'; // xSomethingx

它与Sahil Gulati的正则表达式略有不同,但它基本上会执行相同的匹配。

答案 1 :(得分:1)

Regex demo

PHP code demo

正则表达式:(?:@\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并不以@结尾,但它确实从它开始。要正确识别这些事件,必须设计更广泛的模式。如果这是您/您的项目的问题,那么您应该在您的问题中澄清这一点,以便可以根据需要更新答案。