RegEx-golf:匹配字符串中的所有内容


10

您的任务是编写一个与字符串中的所有内容匹配的RegEx。

字符串定义为被两个未转义的包围(但不包括)的所有内容"

A "可以通过进行转义\,也可以再次进行转义。

测试用例

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

计分

最短的解决方案获胜。

眼镜

  • 请指定使用的风味。
  • 输入将保持平衡"
  • \string-beginning-delimiter之前紧跟着没有。例如,您不需要处理abc\"def"

1
\字符串前会出现吗?例如abc\"def"
jimmy23013 '15

它应该与一组中的每个字符串匹配吗?例如,我可以写一个在其中有两个匹配项的东西吗?abc"de"一个是d,另一个是e
jimmy23013 '16

这是允许的。
Leaky Nun

会有空字符串吗?
马丁·恩德

是的,会有空字符串。
Leaky Nun

Answers:


3

PCRE,21 20 15 19字节

(.|^)"\K(\\.|[^"])*

在这里尝试。

这会在开始的双引号之前匹配一个字符(或输入的开始),然后重置匹配项,以确保不与其他匹配项共享双引号。

PCRE,25 23字节

感谢MartinBüttner打高尔夫球2个字节。

(\\.|[^"])*+(?!"(?R)|$)

在这里尝试。

说明

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

请注意,所有格修饰符(*+)确保否定超前总是在整个字符串或整个非字符串段之后开始。

有4种情况:

  • 比赛从字符串之外的任何地方开始。\\.根据澄清,绝不会匹配双引号。它只能在字符串开始的下一个双引号之前或输入的结尾处结束。两种情况均未通过否定前瞻。
  • 匹配从字符串的开头开始。(\\.|[^"])*+将匹配完整的字符串。下一个字符必须是双引号,并且不能是输入的结尾。在双引号之后,它在字符串之外,因此不能再匹配。因此它通过了负面的预测。
  • 匹配从字符串末尾开始。它以与前面的情况相同的方式匹配一个空字符串。但是根据澄清,这并不重要。
  • 比赛从字符串的中间开始。不可能,因为匹配不重叠。

(\\.|[^"])工作吗?
马丁·恩德

@MartinBüttner匹配一切,除了“
巴林特

我的意思是@Bálint ([^\\"]|\\.),而不是完整的解决方案。
Martin Ender

@MartinBüttner哦,好吧
巴林特

马丁的建议应该起作用,因为\\.只有在之后没有字符\(或换行符,但是可以用标志固定)时,该建议才会失败,并且这种情况由否定的后向掩盖。所有格量词可防止回溯,因此我们没有其他情况可看。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳


0

JavaScript,21 15 13 12字节

"((\\?.)*?)"

字符串内容在组1中。

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.