【问题标题】:regexp ignore match inside double quotes正则表达式忽略双引号内的匹配
【发布时间】:2014-04-09 13:12:08
【问题描述】:

我正在尝试用短语中的一些特殊字符替换空格。但我只在条件下匹配空间。请查看以下示例以进行理解!

我不想将空格与尾随和前导的特殊字符串相匹配,例如

与、或、非、-

我的示例字符串

apple google AND bing NOT yahoo

在上面的例子中,我只想匹配 apple google 之间的空格。所以写下面的代码。

$q = 'apple google AND bing NOT yahoo';
$pattern1 = '/(?<!AND|NOT|OR)[ ](?!-|AND|NOT|OR)/';
$replacement1 = ' ## ';
echo $qs = preg_replace($pattern1, $replacement1, $q,-1);

这是输出

apple ## google AND bing NOT yahoo

我的问题现在,带引号的字符串。我想忽略引号之间的空格。

"apple google" AND bing NOT yahoo => 应该是 0 匹配

那么如何编写表达式来做到这一点?

【问题讨论】:

标签: php regex


【解决方案1】:

你可以使用这个正则表达式:

$s = '"apple google" AND bing NOT yahoo "word a-b"';
$r = preg_replace('/(?=(([^"]*"){2})*[^"]*$)(?<!AND|NOT|OR) +(?!-|AND|NOT|OR)/i', 
                  ' ## ', $s);
echo "$r"; // "apple google" AND bing NOT yahoo ## "word a-b"

这假设引号在输入中是平衡的,因为它通过在前瞻中计算偶数 # 个引号来检测引号内的文本。

【讨论】:

    【解决方案2】:

    这对你有用吗?

    (?<!AND|NOT|OR")[ ](?!-|AND|NOT|OR|[a-zA-Z]+")
    

    编辑

    我有另一个想法,这应该可行:

    (?<!AND|NOT|OR)[ ](?!-|AND|NOT|OR|(([a-zA-Z])\s?)+[a-zA-Z]")
    

    编辑 2 对于带有连字符的单词

        (?<!AND|NOT|OR)[ ](?!-|AND|NOT|OR|(([a-zA-Z-])\s?)+[a-zA-Z]")
    

    编辑 3

    查看 anubhava 的答案以获得更好的方法:)

    【讨论】:

    • 太好了!但是如果我在引号内添加三个单词,我会得到"apple ## google engine" AND bing NOT yahoo
    • 嗯。我想不出一个明确的答案。 Look behinds 不能是零宽度,并且很难说一个引号在哪里结束和开始。
    • 如果输入为"apple google" AND bing NOT yahoo "word a-b"则不起作用
    • @Martyn:实际上这种方法还有很多其他方法会破坏。
    • 例如:'"apple google" AND bing NOT yahoo "word a b"'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2016-04-18
    相关资源
    最近更新 更多