首页 文章

Javascript - 正则表达式 - 单词边界(\ b)问题

提问于
浏览
11

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

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

text used:

希腊语单调:Τογάρούνκαιπαρ 'υμίνλεγόμενον,ώςποτεΦαέθωνΗλίουπαίςτοτουπατρόςάρμαζεύξαςδιατομήδυνατόςείναικατάτηντουπατρόςοδόνελαύνειντατ' επίτηςγήςξυνέκαυσεκαιαυτόςκεραυνωθείςδιεφθάρη,τούτομύθουμένσχήμα έχονλέγεται,τοδέαληθέςεστιτωνπερίγήνκαικατ'ουρανόνιόντωνπαράλλαξιςκαιδιάμακρόνχρόνονγιγνομένητωνεπίγήςπυρίπολλώφθορά . 希腊POLYTONIC:Τὸγὰροὖνκαὶπαρ 'ὑμῖνλεγόμενον,ὥςποτεΦαέθωνἩλίουπαῖςτὸτοῦπατρὸςἅρμαζεύξαςδιὰτὸμὴδυνατὸςεἶναικατὰτὴντοῦπατρὸςὁδὸνἐλαύνειντὰτ' ἐπὶτῆςγῆςξυνέκαυσεκαὶαὐτὸςκεραυνωθεὶςδιεφθάρη,τοῦτομύθουμὲνσχῆμαἔχον λέγεται,τὸδὲὲληθέςἐστιτῶνπερὶγῆνκαὶκατ'οὐρανὸνἰόντωνπαράλλαξιςκαὶδιὰμακρὸνχρόνονγιγνομένητῶνἐπὶτῆςγῆςπυρὶπολλῷφθορά . 英语:事实上,在你们国家和我们的故事中讲述了这个故事,曾经的赫利俄斯的儿子希颂曾经用他的父亲的战车,并且,因为他无法沿着他父亲的路线驾驶它烧毁了地球上的所有东西,他自己被霹雳摧毁了 - 据说,这个故事具有传说的风格,但它的真实性在于天体中身体的移动 . 它绕着地球移动,并且通过猛烈的火焰对地球上的东西进行破坏,这种火灾会在很长的时间间隔内再次发生 .

what I've tried so far:

// 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

EDIT

阅读:

3 回答

  • 3

    您可以使用\ 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,展示了问题中文本使用的模式 .

  • 1

    尝试这样的事情:

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

    由于Javascript没有lookbehind功能,并且由于单词边界仅适用于 \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');
    

相关问题