【问题标题】:.NET Regular Expression to find actual words in text.NET 正则表达式在文本中查找实际单词
【发布时间】:2010-04-19 19:52:35
【问题描述】:

我正在使用 VB .NET 编写一个程序,该程序将从提供的文本文件中获取单词并计算每个单词出现的次数。我正在使用这个正则表达式:-

parser As New Regex("\w+")

它给了我几乎 100% 正确的单词。除非我有像

这样的词

"Ms Word App 文件名为 word.exe。"或“这是一个 c# 语句 If(a>b?1,0) 吗?”

在这种情况下,我得到 [word & exe] AND [If, a, b, 1 and 0] 作为单独的词。我收到 word.exe 和 (If(a>b?1,0) 作为单词会很好(出于我的目的)。

我猜 \w+ 寻找空格、句子终止标点符号和其他标点符号来确定一个单词。

如果标点符号不是单词的结尾,我想要一个类似的正则表达式,它不会用标点符号打断单词。我认为词尾可以由尾随的 WhiteSpace、Sentence termination 标点符号定义(您可能会想到其他人)。如果您可以建议一些用于 VB .NET 的正则表达式 9),那将很有帮助。

谢谢。

【问题讨论】:

    标签: .net regex


    【解决方案1】:

    如果我们假设 .句号后有一个空格,那么这个正则表达式应该可以工作

    [\w(?!\S)\.]+
    

    【讨论】:

    • @Hun1Ahpu:这个是目前为止效果最好的。唯一的问题是,对于句子末尾的单词,它包括终端 FullStop(.)、问号 (?) 和感叹号 (!)。如果单词以逗号(,)结尾,则此 RegEx 也包含它。喜欢:“我喜欢芒果、橙子和香蕉。”将得到“芒果”、“橙子”和“香蕉”。作为词。但如果我有“芒果”、“橙子”和“香蕉”就完美了。
    • @Hun1Ahpu:(续)这个 RegEx 完美地捕获了 word.exe。并且 If(a>b?1,0) 被捕获为“If(a>b?1,0)”。由于终止 FullStop (.)。我可以手动遍历每个单词,查找+省略尾随逗号、句号、感叹号、括号等,但如果可以由 RegEx 处理,那对我来说是 100% 完美的。感谢“到目前为止”的最佳答案!
    • [\w(?!\S)\.] 是一个匹配任何一个字符的字符类:一个单词字符(\w);非空白字符 (\S);或(?!). 之一。如果这个正则表达式对你有用,@Mehdi,那是偶然的;如果你使用\S+,你会得到完全相同的结果。
    • @Alan Moore:是的!你说的对。 \S+ 也给出与 [\w(?!\S)\.]+ 相同的结果我会接受这个答案作为我的解决方案,因为它最接近我的需要。
    【解决方案2】:

    不是这样的正则表达式,但你可以这样做:

    Dim words() As String = myString.Replace(". ", " ").Split(" "c)
    

    (从内存中编写的代码,因此可能不会完全像那样编译)

    编辑:意识到代码可以简化。

    【讨论】:

    • @ho:您的解决方案不包括以“?”结尾的句子或者 ”!”。我将使用 replace+Split 作为最后的手段。
    【解决方案3】:

    根据 Expresso 的默认示例文本,这个表达式有相当不错的(虽然不是完美的)结果:

    ((?:\w+[.\-!?#'])*\w+)(?=\s)
    

    【讨论】:

    • 这个正则表达式没有捕获 word.exe。我想要 word.exe 作为一个词。它以“陈述”作为最后一个词,之后不包括任何内容。所以 If(a>b?1,0) 部分被完全忽略。但我仍然想要那部分作为一个词。感谢您的帖子。
    • 嗯。听起来我需要更加努力!
    【解决方案4】:

    我试图在 COMMENT 部分发布我的代码,但它太长了。我正在回答我自己的问题 ANSWER 真的来自 Hun1Ahpu 和 Alan Moore。

    我正在粘贴有关如何从单词中删除尾随标点符号的代码。

    Private mstrPunctuations As String = ",.'""`!@#$%^&*()_-+=?"
    Dim parser As New Regex("\S+")
            Me.mintWordCount = parser.Matches(CleanedSource).Count
            For Each Word As Match In parser.Matches(CleanedSource)
                Dim NeedChange As Boolean = False
                For Each aChar As Char In Me.mstrPunctuations.ToCharArray()
                    If Word.Value.EndsWith(aChar) Then
                        NeedChange = True
                        Exit For
                    End If
                Next
                If NeedChange Then
                    SetStringStat(Word.Value.Substring(0, Word.Value.Length - 1))
                Else
                    SetStringStat(Word.Value)
                End If
            Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      相关资源
      最近更新 更多