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

时间:2014-05-04 16:50:06

标签: javascript regex word-boundary

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

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

使用的文字:

  

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

     

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

     

ENGLISH:   事实上,在你们国家和我们的故事中讲述了这个故事,曾几何时,赫利俄斯的儿子希颂扯下了他父亲的战车,并因为他无法沿着他父亲的路线开车而被烧毁地球上所有的东西和他自己都被霹雳摧毁了 - 正如所说的那样,这个故事具有传说的风格,但它的真相在于天空中身体移动的发生。环绕地球,用猛烈的火焰摧毁地球上的东西,这种火灾会在很长的时间内再次发生。

到目前为止我尝试过的内容:

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

修改

另请阅读:

3 个答案:

答案 0 :(得分: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');

答案 1 :(得分: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,用于展示问题中文本的模式。

答案 2 :(得分:1)

尝试这样的事情:

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