【问题标题】:Regular expression match a sentence [closed]正则表达式匹配一个句子[关闭]
【发布时间】:2011-07-30 00:46:39
【问题描述】:

如何匹配“Hello world”或“Hello World”形式的句子。该句子可能包含“- / 数字 0-9”。任何信息都会对我很有帮助。谢谢。

【问题讨论】:

  • 第一个("Hello world")怎么成句?没有标点符号。
  • @baba 你是对的哈哈。我修好了。
  • 您写道:may contain "- / digit 0-9"?不允许写字母?这个问题令人困惑......
  • @Matt Ball 可以肯定的是,这不是一个自然语言问题,正则表达式理论中的“句子”是属于正则接受的“语言”的任何输入字符序列表达。
  • 实际上,我发现这是一个非常具有挑战性的问题! (请参阅我的答案中的测试数据。)匹配没有标点符号的最后一个句子会有点棘手。

标签: java regex


【解决方案1】:

这个会做得很好。我对句子的定义:句子以非空格开头,以句点、感叹号或问号(或字符串结尾)结尾。结束标点后可能有一个结束引号。

[^.!?\s][^.!?]*(?:[.!?](?!['"]?\s|$)[^.!?]*)*[.!?]?['"]?(?=\s|$)

import java.util.regex.*;
public class TEST {
    public static void main(String[] args) {
        String subjectString = 
        "This is a sentence. " +
        "So is \"this\"! And is \"this?\" " +
        "This is 'stackoverflow.com!' " +
        "Hello World";
        String[] sentences = null;
        Pattern re = Pattern.compile(
            "# Match a sentence ending in punctuation or EOS.\n" +
            "[^.!?\\s]    # First char is non-punct, non-ws\n" +
            "[^.!?]*      # Greedily consume up to punctuation.\n" +
            "(?:          # Group for unrolling the loop.\n" +
            "  [.!?]      # (special) inner punctuation ok if\n" +
            "  (?!['\"]?\\s|$)  # not followed by ws or EOS.\n" +
            "  [^.!?]*    # Greedily consume up to punctuation.\n" +
            ")*           # Zero or more (special normal*)\n" +
            "[.!?]?       # Optional ending punctuation.\n" +
            "['\"]?       # Optional closing quote.\n" +
            "(?=\\s|$)", 
            Pattern.MULTILINE | Pattern.COMMENTS);
        Matcher reMatcher = re.matcher(subjectString);
        while (reMatcher.find()) {
            System.out.println(reMatcher.group());
        } 
    }
}

这是输出:

This is a sentence.
So is "this"!
And is "this?"
This is 'stackoverflow.com!'
Hello World

正确匹配所有这些(最后一句话没有结束标点符号),结果并不像看起来那么容易!

【讨论】:

  • 如果句子以字母开头,不应该以大写字母开头吗? 100 个示例中有 1 个以大写字母开头,但根本没有字母。
  • @user 未知:也许吧。但是一个句子可以是你想要定义的任何东西。我的定义如上所述。例如,一个句子可能以小写字母开头的程序变量的名称开头。
  • 谢谢。其实我的问题是不完整的,因为我写的很匆忙。我应该用一句话说明我的意思。你的帮助真的很可观。再次感谢。
  • x 应该在句首引用。 :)
  • @ridgerunner,在这种情况下,您能否提供另一个可以排除不完整句子的 RE 即“Hello World”。并且可以包括首字母作为句子的一部分。目前,任何首字母(如 Prof. 或 Mr. )都显示为不同的句子,并将一个完整的句子分成多个句子。
【解决方案2】:

如果你的句子是指以标点符号结尾的东西,试试这个:(.*?)[.?!]

解释:

  • .* 匹配任何字符串。添加? 使其成为非贪婪匹配(匹配可能的最小字符串)
  • [.?!] 匹配三个标点符号中的任何一个

【讨论】:

  • 这不适用于此输入:"Why am I Mr. Pink?"
  • 好的,你把我带到了那里。现在您可能需要一份“违规行为”列表,例如这个并将它们放在一边。无论如何,问题现在已经结束了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 2013-08-05
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多