Ruby regex:“;捕获字符串,除非后跟…“;
我的正则表达式捕获引用的短语:Ruby regex:“;捕获字符串,除非后跟…“;,ruby,regex,Ruby,Regex,我的正则表达式捕获引用的短语: "([^"]*)" 我想通过忽略引号来改进它,引号后面跟着“,-”(逗号、空格和破折号的顺序) 我该怎么做 测试:在正则表达式末尾添加(?!…): "([^"\n]*)"(?!, -) Regex “(.*?”(?!,-) 工作示例 这应该可以通过以下方法实现: 有点恶心,但它起作用了。您需要确保其中一个引号后面没有字符串,否则匹配将从右引号开始 这在您的环境中是不可比拟的,它是开放式的。解析它的唯一方法是使用not和want,但它仍然是一个无效的前提 /“(
"([^"]*)"
我想通过忽略引号来改进它,引号后面跟着“,-”(逗号、空格和破折号的顺序)
我该怎么做
测试:在正则表达式末尾添加(?!…)
:
"([^"\n]*)"(?!, -)
Regex
“(.*?”(?!,-)
工作示例
这应该可以通过以下方法实现: 有点恶心,但它起作用了。您需要确保其中一个引号后面没有字符串,否则匹配将从右引号开始
这在您的环境中是不可比拟的,它是开放式的。解析它的唯一方法是使用not和want,但它仍然是一个无效的前提
/“([^”]*?)”(?!,-)|“[^”]*?”(?=,-)/
然后在每次比赛中检查捕获组1,如下所示:
$rx = qr/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/;
while (' "ingnore me", - "but not me" ' =~ /$rx/g) {
print "'$1'\n" if defined $1
}
我也想到了这一点,但这只适用于每行只有一对引号的情况……我还将
[^”]
替换为[^”\n]
,以防止qoutes中出现换行符。另一种避免这种情况的方法是类似于“(\b[^”]*\b)”(?!,-)
。这只适用于每行最多有一对引号的情况……如果引号可以跨多行,则不起作用。如果不是这样,这是一个很好的解决方案。我只是增强了OP regex以实现他想要的功能。您提到的所有缺陷都存在于原始regex tooThis中,这是迄今为止最好的解决方案-它只会失败如果一个字符串恰好以,-
开头,这不太可能…@Tim-ohh。这一点很好。但是,“([^”]*)”(?!,-)
看似错误的结果可能被认为是有效的,因为会引入歧义。
$rx = qr/"([^"]*?)"(?!, -)|"[^"]*?"(?=, -)/;
while (' "ingnore me", - "but not me" ' =~ /$rx/g) {
print "'$1'\n" if defined $1
}