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
}