【问题标题】:Conditional Regex Replace条件正则表达式替换
【发布时间】:2023-06-13 23:59:02
【问题描述】:

考虑以下文本替换的正则表达式规则

$mystring = preg_replace('/'.$myitem.'[ab]/', "", $mystring);

这将在$mystring 中将$myitem 替换为空白字符,当且仅当它后跟ab

我的要求不是替换为空白字符而是替换为:

a 如果遇到ab 如果遇到b

我不能在两次迭代中做到这一点,例如:

$mystring = preg_replace('/'.$myitem.'a/', "a", $mystring);
$mystring = preg_replace('/'.$myitem.'b/', "b", $mystring);

因为第一次迭代也会对$mystring 产生一些副作用,在这种情况下使第二条规则无用。

有没有办法在一次迭代中进行这种条件替换?

根据答案进行编辑

好的,我的问题过于简单了,但这里是实际的正则表达式规则

'(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))'.$myitem.'(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$)) *([ab])'

现在在这种情况下,当我看到一些条件分组时,如何计算反向引用数。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以在替换中捕获和使用反向引用:

    $mystring = preg_replace('/'.$myitem.'([ab])/', '$1', $mystring);
    

    【讨论】:

    • 谢谢,但我过分简化了我的正则表达式规则。我现在已经编辑了我的问题以包含实际的正则表达式。你能告诉我在这种情况下如何计算反向引用数吗?
    • 这个正则表达式用于整个单词替换,当单词也可能包含特殊字符并且因此简单的单词边界可能不起作用时。我从这里借用了这条规则:*.com/questions/8267307/…
    • 在编辑问题之前查看您有示例输入/输出。没有它就很难理解需求。 IMO 在得到答案后改变问题也是不公平的。如果问题过于简单,那么您也可以提出一个新问题。
    • 我已经给你答案了。没有问题。谢谢
    • 谢谢,请不要误会我的意思。我仍然会尝试回答您的新问题,因为我喜欢处理具有挑战性的正则表达式问题。
    【解决方案2】:

    你可以捕获和替换:

    $mystring = preg_replace('/'.$myitem.'([ab])/', "\1", $mystring);
    

    【讨论】:

    • 谢谢,但我过分简化了我的正则表达式规则。我现在已经编辑了我的问题以包含实际的正则表达式。你能告诉我在这种情况下如何计算反向引用数吗?