Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用正则表达式选择文本中的第一句话?_C#_.net_Regex - Fatal编程技术网

C# 如何使用正则表达式选择文本中的第一句话?

C# 如何使用正则表达式选择文本中的第一句话?,c#,.net,regex,C#,.net,Regex,我的任务是从我用C写的文本中选择第一句话。我想最合适的方法是使用正则表达式,但出现了一些问题。我应该使用什么正则表达式模式来选择第一个句子 几个例子: 输入:我是一头狮子,我想要自由。当你看到我的内心时,你看到了狮子吗?预期结果:我是一头狮子,我想要自由。 输入:我喝得太多了,他们叫我查理4.0手。任何文本。预期结果:我喝得太多了,他们叫我查理4.0手。 输入:所以伸出你的手,把H.U.扔上去现在挥动它,就像你不给一个假的一样预期结果:所以伸出你的手,把H.U.扔上去。 第三个问题让我很困惑。我

我的任务是从我用C写的文本中选择第一句话。我想最合适的方法是使用正则表达式,但出现了一些问题。我应该使用什么正则表达式模式来选择第一个句子

几个例子:

输入:我是一头狮子,我想要自由。当你看到我的内心时,你看到了狮子吗?预期结果:我是一头狮子,我想要自由。 输入:我喝得太多了,他们叫我查理4.0手。任何文本。预期结果:我喝得太多了,他们叫我查理4.0手。 输入:所以伸出你的手,把H.U.扔上去现在挥动它,就像你不给一个假的一样预期结果:所以伸出你的手,把H.U.扔上去。
第三个问题让我很困惑。

我想出了一个正则表达式,它使用了大量的否定形式来排除某些情况,例如标点符号后面不能跟小写字符,或者大写字母前面的点不是结束句子。这将把所有的文本分成不同的句子。如果你收到一条短信,就选第一条

[\s\s]*??![A-Z]+?:\.\.\?\!?:\d |[A-Z]?![a-z]/gm


由于您提供了一些假设:

句子被空格分隔 任务是选择第一句话

您可以使用以下正则表达式:

^.*?[.?!](?=\s+(?:$|\p{P}*\p{Lu}))

正则表达式细分:

^-字符串的开头因此,仅匹配第一个句子 .*? - 任意数量的字符,尽可能少地使用RegexOptions.Singleline来匹配换行符。 [.?!]-最后的标点符号 ?=\s+?:$|\p{p}*\p{Lu}-一种前瞻性方法,确保字符串$或可选标点符号\p{p}和大写字母\p{Lu}的结尾后面有一个或多个空格符号\s+。 更新:

因为事实证明,您可以使用单句输入,并且您的句子可以以任何字母或数字开头,所以您可以使用

^.*?[.?!](?=\s+\p{P}*[\p{Lu}\p{N}]|\s*$)

请参见

应使用以下扫描仪搜索句子分隔符:

如果是像[.!?] 必须后跟空格或允许的字符序列,然后是空格: 就像“.”for“.”的顺序一句话。。。 …或“!”的序列和/或“?”代表“!”还有这里的感叹号!? 然后必须紧跟其后: 大写字符忽略引号(如果有) 数字的 后面必须跟小写或另一个句子结尾 对话开始字符等等…-接下来呢,艾瑞克? 提示:不要忘记在输入源字符串中添加额外的空格字符

Upd:

一些野生伪代码xD:

func sentence(inputString) {
    finishers = ['.', '!', '?']

    allowedSequences = ['.' => ['..'], '!' => ['!!', '?'], '?' => ['??', '!']]

    input = inputString
    result = ''

    found = false
    while input != '' {

        finisherPos = min(pos(input, finishers))

        if !finisherPos
            return inputString

        result += substr(input, 0, finisherPos + 1)
        input = substr(input, finisherPos)

        p = finisherPos

            finisher = input[p]

            p++

            if input[p] != ' '
                if match = testSequence(substr(input, p), allowedSequences[finisher]) {
                    result += match
                    found = true
                    break
                } else {
                    continue
                }
            else {
                p++
                if input[p] in [A-Z] {
                    found = true
                    break
                }

                if input[p] in [0-9] {
                    p++
                    if input[p] in [a-z] or input[p] in finishers {
                        found = true
                        break
                    }
                    p--
                }

                if input[p] in ['-'] {
                    found = true;
                    break
                }
            }

    }

    if !found 
        return inputStr

    return result
}

func testSequence(str, sequences) {
    foreach (sequence: sequences)
        if startsWith(str, sequence)
            return sequence

    return false
}

到目前为止,你都尝试过什么正则表达式模式?如果senteces被粘住了怎么办?就像我是一头狮子,我想要自由。当你看着我的内心时,你看到狮子了吗?我可以为当前的句子提供一个正则表达式,但同样,一些句子怎么样。iPad…?我怀疑是否有一种万无一失的方法可以覆盖所有合法的英语句子。你可以很容易地写出99%正确的小逻辑。句子中的点必须有一些隐藏的逻辑,就像句子中的点只能在数字或大写字母之后使用。是这样吗?如果是,这里的任何人都可以提供regex。。。但HubertL有一个很好的观点——到目前为止,您尝试了哪些正则表达式,即您应该自己解决家庭作业-用英语找出规则,然后试着将它们翻译成正则表达式,并询问是否需要帮助。这是一个与C相关的问题,而不是JavaScript。你需要学习更多关于角色类的知识,才能写出更多的最佳模式\d |[A-Z]或?:\.|\?|\!与[\dA-Z]和[?!.]相比效率不高。我希望它至少会有帮助。回答得很好,尽管当文本中只有一个句子没有尾随空格时,它并不匹配。它可以用^.*.[.?!]?=\s+\p{p}*\p{Lu}\s*$来解决。事实上,我认为还有另一个假设:输入中必须至少有两个句子。这非常接近我需要的。我的最终解决方案是:^.*?[.?!]?=\s+\p{p}*\p{Lu}|\d}\s*$。因为句子可以以数字开头。