繁体   English   中英

使用正则表达式从字符串中删除所有非拉丁文段落

[英]Remove all non-latin passages from a string with regex

我需要从字符串中删除所有包含非拉丁字符的段落,但与我见过的许多答案不同,我还想删除这些段落中的标点符号,同时在英文段落中保留相同的标点符号。

换句话说,当遇到一个非拉丁字符如“ָהּ”时,正则表达式将开始跳过包括ascii标点在内的所有内容,直到找到一个[a-zA-Z]字符。

我尝试了以下示例,但它错误地删除了“一半”后的引号,这让我相信我对非拉丁字符没有很好的定义。

[\ɐ-\][^a-zA-Z]*

这是输入文本的示例(已更新):

or perhaps, a - אוֹ דִילְמָא אֵין אִשָּׁה מִתְקַדְּשֶׁת לַחֲצָאִין כְּלָל (12);time
תֵּיקוּ
person cannot be in separate halves at all, even
though both "halves” would come together simultaneously?(13)
The speaker replies:(14)

结果字符串是:

or perhaps, a - time
person cannot be in separate halves at all, even
though both "halveswould come together simultaneously?(13)
The speaker replies:(14)

如您所见,它在第三行搞砸了。 显然,我可以排除那个特定的角色,但我担心它会在其他边缘情况下搞砸。

还有其他想法吗? (顺便说一句,我正在使用 Javascript)

替换任何非拉丁字母字符,该字符可选地后跟除[a-zA-Z]之外的任意数量的字符和一个更多非拉丁字母字符。

要使用您自己的\ɐ-\定义作为边界:

/[\u0250-\ue007]([^a-z]*[\u0250-\ue007])?/gis

我理解“非拉丁字符,例如הּ ”是指任何非 ASCII字母

要匹配 ASCII 字母以外的任何字母,您可以使用[^\\P{L}a-zA-Z] 这是一个否定字符类,它匹配非字母字符 ( \\P{L} ) 和 ASCII 字母 ( a-zA-Z ) 以外的任何字符。 所以,它基本上是\\p{L}模式,除了 ASCII 字母。

这个基于 Unicode 字符类的模式需要一个u标志,由 Node.js JavaScript 环境支持。

解决方案看起来像

text = text.replace(/[^\P{L}a-z][^a-z]*/gui, '')

请注意g标志使replace替换字符串中的所有出现,而i用于缩短 ASCII 字母模式(因为它使模式匹配不区分大小写)。

请参阅 JavaScript 演示:

 const text = `or perhaps, a - אוֹ דִילְמָא אֵין אִשָּׁה מִתְקַדְּשֶׁת לַחֲצָאִין כְּלָל (12);time תֵּיקוּ person cannot be in separate halves at all, even though both "halves” would come together simultaneously?(13) The speaker replies:(14)`; console.log( text.replace(/[^\\P{L}az][^az]*/gui, '') )

输出:

or perhaps, a - time
person cannot be in separate halves at all, even
though both "halves” would come together simultaneously?(13)
The speaker replies:(14)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM