【问题标题】:Matching sentences with regex in Java用Java中的正则表达式匹配句子
【发布时间】:2011-02-08 15:34:40
【问题描述】:

我正在使用 Java 中的 Scanner 类来浏览一个文本文件并提取每个句子。我在我的扫描仪上使用 setDelimiter 方法到正则表达式:

Pattern.compile("[\\w]*[\\.|?|!][\\s]")

这目前似乎有效,但它在句子末尾留下了空格。有没有一种简单的方法可以匹配末尾的空格但不将其包含在结果中?

我意识到这可能是一个简单的问题,但我以前从未使用过正则表达式,所以放轻松:)

【问题讨论】:

    标签: java regex text-segmentation


    【解决方案1】:

    您正在寻找的是积极的前瞻性。应该这样做:

    Pattern.compile("\\w*[.?!](?=\\s)")
    

    【讨论】:

    • 感谢您的帮助,但这似乎没有用。我原来的一个用两句话制作了以下内容(注意末尾的空格):“快速棕色狐狸跳过懒惰” “这是另一个将在测试中进行的句子” 你的似乎产生了以下内容:“快速的棕色狐狸跳过懒惰的人” “这是另一个将在测试中出现的句子”
    • 刚刚发现最后一个字也不见了,知道为什么吗?
    • @WoLpH:不应该是 Pattern.compile("\\w*[.?!](?=\\s)"),因为字符内部的表达式有不同的语义类而不是普通类?
    • 确实是ig0774,我会改的。
    • @Gary:试试修改后的版本。原来的正则表达式有一些缺陷
    【解决方案2】:

    试试这个:

    "(?<=[.!?])\\s+"
    

    这使用lookarounds 匹配\\s+ 前面是[.!?]


    如果您也想删除标点符号,那么只需将其作为匹配的一部分:

    "[.!?]+\\s+"
    

    这会将"ORLY!?!? LOL" 拆分为"ORLY""LOL"

    【讨论】:

    • 这仅匹配单词,但不会停在句末。感谢您的尝试!
    • @Gary:抱歉,现已修复。再试一次。
    • 除了删除末尾的句点之外,什么都做!有没有一种简单的方法可以使用正则表达式删除句点,还是我应该在之后更改字符串?编辑:忘了说我也想忽略逗号,我应该用正则表达式还是手动?
    • 忽略逗号是什么意思?现在这个正则表达式不认为逗号作为句子分隔符。你想要吗?
    • 没关系,进一步思考:这可能不是这个正则表达式的工作。非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2018-01-23
    • 2019-12-17
    • 2010-12-29
    • 2011-03-30
    • 2011-05-26
    相关资源
    最近更新 更多