Java 正则表达式匹配句子
如何匹配“Hello world”或“Hello world”形式的句子。该句可包含“-/位0-9”。任何信息都会对我很有帮助。谢谢。如果你所说的句子是指以标点符号结尾的东西,试试这个:Java 正则表达式匹配句子,java,regex,Java,Regex,如何匹配“Hello world”或“Hello world”形式的句子。该句可包含“-/位0-9”。任何信息都会对我很有帮助。谢谢。如果你所说的句子是指以标点符号结尾的东西,试试这个:(.*?[.?!]) 说明: *匹配任何字符串。添加?使其成为非贪婪匹配(匹配尽可能最小的字符串) [.?!]匹配三个标点符号中的任意一个 这一个会做得很好。我对句子的定义是:句子以非空格开头,以句号、感叹号或问号(或字符串结尾)结尾。结尾标点符号后面可能有结束语 import java.util.regex
(.*?[.?!])
说明:
匹配任何字符串。添加*
使其成为非贪婪匹配(匹配尽可能最小的字符串)?
匹配三个标点符号中的任意一个[.?!]
- 这一个会做得很好。我对句子的定义是:句子以非空格开头,以句号、感叹号或问号(或字符串结尾)结尾。结尾标点符号后面可能有结束语
import java.util.regex.*;
公开课考试{
公共静态void main(字符串[]args){
字符串主题字符串=
“这是一句话。”+
“这也是”!这是吗?”+
“这是‘stackoverflow.com!'”+
“你好,世界”;
String[]句=null;
模式re=Pattern.compile(
“#匹配以标点或EOS结尾的句子。\n”+
[^.!?\\s]#第一个字符是非点状的,非ws\n+
“[^.!?]*#贪婪地消耗多达个标点符号。\n”+
(?:#用于展开循环的组。\n+
“[.!?]#(特殊)内部标点符号ok,如果\n”+
(?!['\“]?\\s |$)#后面不跟ws或EOS。\n+
“[^.!?]*#贪婪地消耗多达个标点符号。\n”+
“”*#零或更多(特殊法线*)\n“+
“[.!?]?#可选结尾标点符号。\n”+
“['\”]?#可选结束引号。\n”+
“(?=\\s |$)”,
Pattern.MULTILINE | Pattern.COMMENTS);
Matcher-reMatcher=re.Matcher(subjectString);
while(reMatcher.find()){
System.out.println(reMatcher.group());
}
}
}
以下是输出:
这是一个句子。
这个也是代码>
“这是什么?”
这里是'stackoverflow.com!'代码>
Hello World
正确匹配所有这些(最后一句没有结尾标点符号),结果并不像看上去那么容易 第一个(“Hello world”
)是一个怎样的句子?没有标点符号。@baba你说得对,哈哈。我修复了它。您写道:可能包含“-/数字0-9”
?不准写信?这个问题令人困惑…@Matt Ball这肯定不是自然语言问题,正则表达式理论中的“句子”是属于正则表达式接受的“语言”的任何输入字符序列。事实上,我发现这是一个非常具有挑战性的问题!(请参阅我答案中的测试数据。)匹配没有标点符号的最后一句话会有点麻烦。这对输入不起作用:“我为什么是粉红先生?”
好的,你让我明白了。现在,您可能需要一个“违规行为”列表,如此,并将其放在一边。不管怎么说,问题已经解决了。如果一个句子是以字母开头的,那么它不应该以大写字母开头吗?100个示例中有1个以大写字母开头,但根本没有字母。@用户未知:可能。但是一个句子可以是你想定义的任何东西。我的定义如上所述。例如,一个句子可能以程序变量的名称开头,该名称以小写字母开头。谢谢。实际上我的问题不完整,因为我写得很匆忙。我应该用一句话来说明我的意思。你的帮助真是值得赞赏。再次感谢。x
应在句首引用。:)@ridgerunner,你能不能再给一个RE,在这种情况下可以排除不完整的句子,比如“Hello World”。并且可以将首字母缩写作为句子的一部分。目前,任何首字母(如Prof.或Mr.)都显示为不同的句子,并将完整的句子分成多个句子。