用于在未转义的下划线之间匹配文本的正则表达式

时间:2017-01-05 07:55:25

标签: php regex string replace

我正在尝试用标记替换下划线之间的文本。 这就是我目前正在使用的模式(链接到在线测试器:TESTER):

[^\\]?_(([^_]*)[^\\])_

这是我想要得到的结果:

_test1_ _test2__test3_ \_test4\_ => <b>test1</b> <b>test2</b><b>test3</b> \_test4\_

谁能告诉我我的模式有什么问题?

1 个答案:

答案 0 :(得分:0)

您可以使用

(?<!\\)((?:\\{2})*)_([^_\\]*(?:\\.[^_\\]*)*)_

PHP声明:

$pattern = '~(?<!\\\\)((?:\\\\{2})*)_([^_\\\\]*(?:\\\\.[^_\\\\]*)*)_~';

请参阅regex demo

<强>详情:

  • (?<!\\)((?:\\{2})*)_ - 匹配未转义的_:任意数量的双\符号(请参阅(?:\\{2})*,0 +两个连续\符号的序列)前面没有\(?<!\\)负面后卫执行此检查)
  • ([^_\\]*(?:\\.[^_\\]*)*)_ - 匹配_以外的任意数量的符号或任意数量的转义符号,因此仅匹配第一个未转义符号_
    • [^_\\]* - 匹配\_以外的0 +字符
    • (?:\\.[^_\\]*)* - 0+序列:
      • \\. - 任何转义字符(如果您使用s DOTALL修饰符,甚至是换行符字符号)
      • [^_\\]* - 除\_
      • 以外的0个字符

要在JavaScript和其他不支持lookbehind的正则表达式引擎中使用相同的方法,请使用(^|[^\\])组而不是(?<!\\)

(^|[^\\])((?:\\{2})*)_([^_\\]*(?:\\.[^_\\]*)*)_

并替换为$1$2<b>$3</b>。请参阅this regex demo