我上周试图查找包含由标点字符分隔的特定单词的文本部分。这很有效。
[^.?!:]*\b(why|how)\b[^.?!]*[.?!]
在下面的"How did you do it? bla bla bla! why did you do it?"
句中,它给出了以下输出:
"How did you do it?"
"why did you do it?"
现在我正在尝试添加连字符:我想检测是否有一个带有空格的连字符(一个新的句子分隔符):
"The man went walking upstairs - why was he there?
这会让我回复:"why was he there?"
它将遵循以下规则:
hello - bye -> this would be the only one to be matched
hello-bye -> not matched
hello -bye -> not matched
hello- bye -> not matched
使用否定,我试图添加该部分:
[^.?!:\\s\\-\\s] => ignore everything that ends with a "." or a "?" or a "!" or a ":" or a " - "
我不行,但由于我使用正则表达式非常糟糕,我可能会遗漏一些明显的东西。
var regex = /[^.?!:\\s\\-\\s]*\b(why|how)\b[^.?!]*[.?!]/igm
var text = "Here I am - why did you want to see me?"
var match;
while ((match = regex.exec(text)) != null) {
console.log(match);
}
输出:
Here I am - why did you want to see me?
预期产出:
why did you want to see me?
答案 0 :(得分:1)
[ ]
始终是一个字符类,这意味着在一个位置,您可以匹配一个字符。你的例子中的“否定”实际上可能甚至没有做你所做的事情。
您可能想要匹配的是字符串的开头,句子的结尾或带有两个空格的短划线,因此只需将其替换为(^|[.?!]| - )\b((why|how)...etc)
即可。您将需要对结果进行一些后期处理,因为据我所知,JavaScript不支持后置断言。
答案 1 :(得分:1)
鉴于你的4个例子,这是有效的。
/\s-\s(\w*)/g
在此测试 - https://regex101.com/r/YQhRBI/1
我匹配问题部分中的任何字符。如果您想匹配特定的关键字,请将(\w*)
与([why|how|who|what|where|when])
我认为如果你有一个段落,你必须确保找到一种方法来终止带有特定分隔符的答案部分。如果每个新行更符合问题/答案,那么您只需要使用行尾锚点结束正则表达式。
答案 2 :(得分:1)
我看到两个问题:
[^.?!:\s\-\s]
替换为(?:(?!\s-\s)[^.?!:])*)
。您可以使用
var regex = /(?:(?!\s-\s)[^.?!:])*\b((?:why|how)\b[^.?!]*)[.?!]/ig
其中(?:(?!\s-\s)[^.?!:])*
是tempered greedy token,与^.?!:
以外的任何字符匹配,但未启动whitespace
+ -
+ whitespace
模式。
var regex = /(?:(?!\s-\s)[^.?!:])*\b((?:why|where|pourquoi|how)\b[^.?!]*)[.?!]/ig;
var text = "L'Inde a déjà acheté nos rafales, pourquoi la France ne le -dirait-elle pas ?";
var match;
while ((match = regex.exec(text)) != null) {
console.log(match[1]);
}