仅在 preceded/succeeded 时通过 `character` 捕获 `character`

Only capture `character` when preceded/succeeded by `character`

正则表达式: /@{0,1}\s*x(.*?)x\s*@{0,1}/

我试图强制使用的语法是 xSomethingx@xSomethingx@,其中 @ 中允许有空格,但 captured 中没有 [=] 14=]的。

应匹配:

@ xSomethingx @ => @ xSomethingx @

. xSomethingx . => xSomethingx

到目前为止我尝试了什么: 我已经尝试了很多 looksaheadslookbehinds positivenegative 但我只能让它不 match 而我不想capture spaces 在那种情况下。我也玩过 non-capturing groups.

这里有任何指示吗?如果需要可以澄清更多。

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
)

这个也适合你:

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

-

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

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

这是最适合您的新 answer/pattern:/(?:@ *)?x.*x(?: *@)?/

这处理您的字符串 的速度几乎是 Sahil 的 的两倍,因为他的模式错误地使用了管道和不必要的捕获组。您会看到我在点上使用了贪婪量词(如 Eduardo),因为如果子字符串中有 x,那么该模式将不会捕获整个预期字符串——这是一个潜在的失败以 Sahil 的模式。

Pattern Demo(插入 Sahil 的模式以查看它如何无法完全匹配其中一个字符串。)

但是,我想指出的是,此页面上的所有答案都无法验证捕获的字符串是否在开始时就结束了。我的意思是,看看我的正则表达式演示,@xsome@thingx 不是以 @ 结尾,而是以它开头。要正确识别这些事件,必须设计更广泛的模式。如果这对您/您的项目来说是一个问题,那么您应该在您的问题中澄清这一点,以便可以根据需要更新答案。