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