我正在尝试用标记替换下划线之间的文本。 这就是我目前正在使用的模式(链接到在线测试器:TESTER):
[^\\]?_(([^_]*)[^\\])_
这是我想要得到的结果:
_test1_ _test2__test3_ \_test4\_ => <b>test1</b> <b>test2</b><b>test3</b> \_test4\_
谁能告诉我我的模式有什么问题?
答案 0 :(得分:0)
您可以使用
(?<!\\)((?:\\{2})*)_([^_\\]*(?:\\.[^_\\]*)*)_
PHP声明:
$pattern = '~(?<!\\\\)((?:\\\\{2})*)_([^_\\\\]*(?:\\\\.[^_\\\\]*)*)_~';
请参阅regex demo
<强>详情:
(?<!\\)((?:\\{2})*)_
- 匹配未转义的_
:任意数量的双\
符号(请参阅(?:\\{2})*
,0 +两个连续\
符号的序列)前面没有\
((?<!\\)
负面后卫执行此检查)([^_\\]*(?:\\.[^_\\]*)*)_
- 匹配_
以外的任意数量的符号或任意数量的转义符号,因此仅匹配第一个未转义符号_
。
[^_\\]*
- 匹配\
和_
以外的0 +字符(?:\\.[^_\\]*)*
- 0+序列:
\\.
- 任何转义字符(如果您使用s
DOTALL修饰符,甚至是换行符字符号)[^_\\]*
- 除\
和_
要在JavaScript和其他不支持lookbehind的正则表达式引擎中使用相同的方法,请使用(^|[^\\])
组而不是(?<!\\)
:
(^|[^\\])((?:\\{2})*)_([^_\\]*(?:\\.[^_\\]*)*)_
并替换为$1$2<b>$3</b>
。请参阅this regex demo。