【问题标题】:Javascript - regex - word boundary (\b) issueJavascript - 正则表达式 - 字边界 (\b) 问题
【发布时间】:2014-06-20 22:50:55
【问题描述】:

我在正则表达式中使用 \b 和希腊字符时遇到了困难。

this example[a-zA-ZΆΈ-ώἀ-ῼ]* 成功标记了我想要的所有单词(希腊语和英语)。现在考虑我想找到有 2 个字母的单词。对于英语,我使用类似this: \b[a-zA-Z]{2}\b。你能帮我写一个成功用 2 个字母标记希腊语单词的正则表达式吗? (为什么?我的最终目标是删除它们)。

使用的文字:

希腊单音: Τογάρούνκαιπαρ 'υμίνλεγόμενον,ώςποτεΦαέθωνΗλίουπαίςτοτουπατρόςάρμαζεύξαςδιατομήδυνατόςείναικατάτηντουπατρόςοδόνελαύνειντατ' επίτηςγήςξυνέκαυσεκαιαυτόςκεραυνωθείςδιεφθάρη,τούτομύθουμένσχήμαέχονλέγεται,το δέ αληθές εστι των περί γήν και κατ' ουρανόν ιόντων παράλλαξις και διά μακρόν χρόνον γιγνομένη των επί γής πυρί πολάνα φθορ.

希腊 POLYTONIC: Τὸγὰροὖνκαὶπαρ 'ὑμῖνλεγόμενον,ὥςποτεΦαέθωνἩλίουπαῖςτὸτοῦπατρὸςἅρμαζεύξαςδιὰτὸμὴδυνατὸςεἶναικατὰτὴντοῦπατρὸςὁδὸνἐλαύνειντὰτ' ἐπὶτῆςγῆςξυνέκαυσεκαὶαὐτὸςκεραυνωθεὶςδιεφθάρη,τοῦτομύθουμὲνσχῆμαἔχονλέγεται,τὸ ΔὲὲληθέςἐστιτῶνῶνῶνὶκὐὐνὸννὸνὐὐὐὐννπίαάνἰόννννςὸνὶὶὰὰιννὸνένόνῶνῶνῶνῶνὶῆςῶνῆςΠὶὶπολλῷφθορς。

英语: 因为事实上,在你们国家和我们国家都流传着这样一个故事,从前赫利俄斯的儿子法厄同如何驾驭他父亲的战车,因为他无法驾驶它沿着他父亲的路线行驶,因此被烧毁了地球上的一切,他自己都被一道霹雳摧毁了——这个故事,正如人们所说的那样,具有传奇色彩,但它的真实性在于发生在天空中移动的物体的移动环绕地球,并用猛烈的火焰摧毁地球上的事物,这种火焰会在很长一段时间内反复发生。

到目前为止我所做的尝试:

// 1
txt = txt.replace(/\b[a-zA-ZΆΈ-ώἀ-ῼ]{2}\b/g, '');

// 2
tokens = txt.split(/\s+/);
txt = tokens.filter(function(token){ return token.length > 2}).join(' ');

// 3
tokens = txt.split(' ');
txt = tokens.filter(function(token){ return token.length != 3}).join(' ') );

2 & 3 被建议到我的问题这里:Javascript - regex - how to remove words with specified length

编辑

另请阅读:

【问题讨论】:

    标签: javascript regex word-boundary


    【解决方案1】:

    由于 Javascript 没有后视功能,并且单词边界仅适用于 \w 字符类的成员,因此唯一的方法是使用组(如果您想进行替换,还可以捕获组):

    (?m)(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])
    

    去除2个字母单词的例子:

    txt = txt.replace(/(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])/gm, '\1');
    

    【讨论】:

    • 您的方法最接近我想要的,但有时会删除换行符。 (Demo)
    • @antithesis:确实,看我的编辑,我已经纠正了这个问题。
    • 你能解释一下 ^| 是什么意思吗?在第一个括号内做?
    • @antithesis:| 是一个正则表达式特殊字符,意思是“或”,^ 是行首的锚。第一个括号替换单词边界(因为您不能将此功能与希腊字母一起使用)。第一个括号表示:“行首或不是字母(希腊语或拉丁语)的字符”。
    • 谢谢!我还在第一场和第三场比赛中使用了 0-9,因为我要删除诸如“2TB”或“mp3”之类的词。
    【解决方案2】:

    你可以使用 \S

    与其为“单词字符加上这些字符”编写匹配,不如使用匹配非空格的正则表达式:

    \S
    

    范围更广,但编写/使用更简单。

    如果这宽泛 - 使用排他列表而不是包含列表:

    [^\s\.]
    

    也就是说 - 任何不是空格不是点的字符。这样也很容易添加到异常中。

    不要尝试使用\b

    字边界don't work with none-ascii characters很容易演示:

    > "yay".match(/\b.*\b/)
    ["yay"]
    > "γaγ".match(/\b.*\b/)
    ["a"]
    

    因此,无法使用\b 检测带有希腊字符的单词 - 每个字符都是一个匹配边界。

    匹配 2 个字符的单词

    以下模式可用于匹配两个字符词:

    pattern = /(^|[\s\.,])(\S{2})(?=$|[\s\.,])/g;
    

    (更准确地说:匹配两个非空白序列)。

    即:

    (^|[\s\.,]) - start of string or whitespace/punctuation (back reference 1)
    (\S{2})     - two not-whitespace characters (back reference 2)
    ($|[\s\.,]) - end of string or whitespace/punctuation (positive lookahead)
    

    可以像这样使用该模式来删除匹配的单词:

    "input string".replace(pattern);
    

    这是一个jsfiddle,展示了问题文本中使用的模式。

    【讨论】:

    • 感谢您所做的所有工作,但您能检查一下换行和省略号的一些问题吗? DEMO
    • 省略号很容易解释 - 我在答案中添加了这种排列。新行只需要一个多行标志,我稍后会测试它。看来我已经回答了您的其他问题 - 请参阅 js fiddle。
    【解决方案3】:

    试试这样的:

    \s[a-zA-ZΆΈ-ώἀ-ῼ]{2}\s
    

    【讨论】:

    • 如果 2 个字母的单词在句尾或后跟逗号我猜将不匹配
    • 你是对的。但对于简单的文本内容,可以轻松添加其他符号/波动,如逗号、(半)列、点......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2011-03-28
    • 2014-03-30
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多