正则表达式匹配反斜杠数量但不超过x个

3

我正在尝试匹配字符串中的双反斜杠,但仅在有两个而不是三个时才能替换其中的2为3。

我知道\\{2}可以匹配双反斜杠,但当存在3个反斜杠时它也会匹配前面的2个反斜杠。

例如,在以下字符串中:

{"files":{"windows": {"%windir%\\\System32\\drivers\\etc\\lmhosts.sam":{"ignore":{"id":32}},"%windir%\\System32\\\drivers\\etc":{"ignore":{"id":32}},"%windir%\\System32\\drivers\\etc\\hosts":{"ignore":{"id":32}}}}}

我希望能够匹配和替换多个双斜杠,但也有一些三个斜杠需要保留。所以我的问题是,当双斜杠不与另一个斜杠相邻时,如何匹配双斜杠?这里有一个 Regex101 链接可以尝试使用。 https://regex101.com/r/kWIscW/1同时,我正在使用 Ruby 进行操作。

尝试一下这个:**(?<!\)\{2}(?!\)** - Vijay Wilson
3个回答

3
如何考虑:
\b\\{2}\b

为了定义你只是被评估的唯一字符\\

另一个可能性是向前和向后查看,但不确定你的正则表达式引擎是否支持它:

(?<=[^\\])\\{2}(?=[^\\])

该死,Casimir是正确的。如果字符串看起来像\Some\Thing,它将错过第一组。否则它可以工作,有什么解决方法吗? - Cheyne
这看起来可以解决问题,但我似乎无法在 Ruby 中使其工作。它确实符合我需要的要求。 - Cheyne
1
预查在字符串的开头和结尾不起作用。 - akuhn

3
r = /
    (?<!\\)  # do not match a backslash, negative lookbehind
    \\\\     # match two backslashes
    (?!\\)   # do not match a backslash, negative lookahead
    /x       # free-spacing regex definition mode

str = "\\\\\ are two backslashes and here are three \\\\\\ of 'em"
puts str  
  # \\ are two backslashes and here are three \\\ of 'em
str.scan(r)
  #=> ["\\\\"] 

请注意,s = "\\\\\ " 是两个反斜杠后跟一个转义空格。
s.size
  #=> 3
s[0].ord
  #=> 92
92.chr
  #=> "\\"
s[1].ord
  #=> 92 
s[2].ord
  #=> 32 

2

首先,让我们来解决字符串字面值中的反斜杠问题,

  • "\\"代表一个反斜杠
  • "\\\\"代表两个反斜杠
  • "\\\\\\"代表三个反斜杠

为什么呢?因为在字符串字面值中,反斜杠是转义序列,例如"\n"表示换行符,因此必须用反斜杠进行转义以编码一个反斜杠。

现在,请尝试这个:

string = "\\\\aaa\\\\bbb\\\\\\ccc"
string.gsub(/\\+/) { |match| match.size == 2 ? '/' : match  } 
# => "/aaa/bbb\\\\\\ccc"

这是怎么工作的?

  • /\\+/ 匹配任何反斜杠序列
  • match.size == 2 过滤长度为2的匹配项
  • 然后我们只需替换它们

抱歉,这对我似乎不起作用。给定字符串为“\Microsoft\Windows\\Something”,这似乎将三个反斜杠修改为两个。 - Cheyne
小心处理字符串, "\" 代表一个反斜杠, "\\" 则代表两个反斜杠。 - akuhn
2
"\\\\" 是两个反斜杠。 - akuhn
2
Cheyne,akuhn的代码对你提出的问题有效。你的示例字符串仅包含单个反斜杠字符("\\"),在某些情况下后面跟着一个转义字符("\\\S")。 - Cary Swoveland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接