在JavaScript中的问号,感叹号或句点处拆分字符串并保留这些标记?

时间:2018-12-23 05:52:43

标签: javascript regex ecmascript-6

我有点惊讶,实际上没有人在javascript中遇到过完全相同的问题...

我尝试了几种不同的解决方案,但都无法正确解析内容。

我尝试过的最接近的方法:(我从PHP解决方案中窃取了它的regex查询)

const test = `abc?aaa.abcd?.aabbccc!`;
const sentencesList = test.split("/(\?|\.|!)/");

但是结果只会是 ["abc?aaa.abcd?.aabbccc!"]

我想得到的是 ['abc?', 'aaa.', 'abcd?','.', 'aabbccc!'] 我很困惑..到底是什么问题?

3 个答案:

答案 0 :(得分:7)

/[a-z]*[?!.]/g)将做您想要的事情:

const test = `abc?aaa.abcd?.aabbccc!`;
console.log(test.match(/[a-z]*[?!.]/g))

答案 1 :(得分:2)

为了帮助您,您编写的不是正则表达式。 test.split("/(\?|\.|!)/");只是一个11个字符串。正则表达式将是test.split(/(\?|\.|!)/);。这仍然不是您要查找的正则表达式。

此正则表达式的问题在于它正在寻找?.! 个字符,并捕获该单独的字符。您想要做的是找到任意数量的字符,然后是这三个字符之一。

接下来,String.split不接受正则表达式作为参数。您将要使用一个接受它们的函数(例如String.match)。

将所有内容放在一起,您将需要使用类似/.*?/的东西来开始您的正则表达式。点表示任何字符都匹配,星号表示0或更大,问号表示“非贪婪”,或者在保持有效匹配的同时尝试匹配尽可能少的字符。

要搜索三个字符,请在此之后加上/[?!.]/,以指示您要使用这三个字符中的一个(到目前为止,我们有/.*?[?!.]/)。最后,您想添加g标志,以便它搜索每个实例,而不仅是第一个。 /.*?[?!.]/g。现在我们可以在match中使用它了:

const rawText = `abc?aaa.abcd?.aabbccc!`;
const matchedArray = rawText.match(/.*?[?!.]/g);
console.log(matchedArray);

答案 2 :(得分:0)

以下代码有效,我认为我们不需要模式匹配。我收回,我一直在用 Java 回答。

final String S = "An sentence may end with period. Does it end any other way? Ofcourse!";
final String[] simpleSentences = S.split("[?!.]");
//now simpleSentences array has three elements in it.