繁体   English   中英

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

[英]Javascript - regex - word boundary (\b) issue

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

这个例子中 [a-zA-ZΆΈ-ώἀ-ῼ]*成功地标记了我想要的所有单词(希腊文和英文)。 现在考虑我想找到2个字母的单词。 对于英语,我使用这样的东西 \\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 - 正则表达式 - 如何删除指定长度的单词

编辑

阅读:

由于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');

你可以使用\\ S.

不是为“单词字符加上这些字符”写一个匹配,而是使用匹配非空格的正则表达式是合适的:

\S

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

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

[^\s\.]

那就是 - 任何不是空格不是点的字符。 通过这种方式,添加异常也很容易。

不要试图使用\\ b

字边界不适用于非ascii字符 ,这很容易演示:

> "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,展示了问题中文本的模式使用。

尝试这样的事情:

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

暂无
暂无

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

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