用空格查找字符

时间:2016-10-11 13:43:56

标签: javascript regex

我上周试图查找包含由标点字符分隔的特定单词的文本部分。这很有效。

[^.?!:]*\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?

3 个答案:

答案 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)

我看到两个问题:

  • 反斜杠(在正则表达式文字中使用单个,在构造函数中使用double)和
  • 在字符类中使用序列(将[^.?!:\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]);
}