0

我在日常工作中处理了很多正则表达式。听起来很奇怪,有时我什至使用 RegEx 来编辑/修复/格式化我的 RegEx 表达式。然而,这是困扰我的一个问题。我如何正确捕获转义字符,并且只有那些真正转义的字符?

字符串列表:

this is a test
this is a te\st
this is a te\\st
this is a te\\\st
this is a te\\\\st
this is a te\\\\\st
this is a te\\\\\\st

如果我只想匹配“s”是(或不是)字符类(即空格)的那些,我该怎么做?

解释:

this is a test       = test
this is a te\st      = te \s t
this is a te\\st     = te \\ st
this is a te\\\st    = te \\ \s t
this is a te\\\\st   = te \\ \\ st
this is a te\\\\\st  = te \\ \\ \s t
this is a te\\\\\\st = te \\ \\ \\ st

您不能简单地使用 a[^\\]s(?<!\\)s。我尝试了多种组合,但没有成功。我如何捕捉:

this is a test
this is a te\\st
this is a te\\\\st
this is a te\\\\\\st

和/或相反:

this is a te\st
this is a te\\\st
this is a te\\\\\st

我尝试过的变体。. .

.*(?<=(?<!\\)(?<=(\\\\)+))st.*
.*((?<=(?<!\\)(\\\\)+)|(?<!\\))st.*

编辑:这需要是动态长度。

4

2 回答 2

1

我会使用这样的东西来获得所有的“真实” s

(?<!\\)(?:\\.|[^\\\n])*?(s)

正则表达式101演示

和类似的东西让所有的人逃脱s

(?<!\\)(?:\\.|[^\\\n])*?(\\s)

正则表达式101演示

于 2013-10-31T18:07:39.183 回答
0

如果您的正则表达式引擎支持无限后向,您可以编写:

(?<=(?:^|[^\\])(?:\\\\)*)\\s

匹配\s前面是字符串开头或非反斜杠字符加上偶数个反斜杠。

但我通常使用的方法是匹配我感兴趣的任何一个或任何转义序列,然后编写一个适用于这两种情况的替换表达式 \\ 例如,在 JavaScript 中:

var result =
     input.replace(/\\[\\s]/g, function ($0) {
         if ($0 === '\\\\') {
             return '\\\\';
         } else {
             ...
         }
     });
于 2013-10-31T18:08:30.530 回答