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


我使用起来很困难 \b 和正则表达式中的希腊字符。

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

使用的文字:

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

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

英语:   事实上,在你们国家和我们的故事中讲述了这个故事,曾经有过一次,赫利俄斯的儿子希颂y his his y y y y y y y y y ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,地球上的所有东西和他自己被霹雳摧毁了 - 正如所说的那样,这个故事具有传说的风格,但它的真相在于天空中身体移动的发生。环绕地球,并通过猛烈的火焰摧毁地球上的东西,这种火灾会在很长的时间间隔内再次发生。

到目前为止我尝试过的:

// 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 - 正则表达式 - 如何删除指定长度的单词

编辑

阅读:


9862
2018-05-04 16:50


起源



答案:


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

11
2018-05-04 16:54



您的方法最接近我想要的但有时会删除换行符。 (演示) - tgogos
@antithesis:确实,看到我的编辑,我已经纠正了这个问题。 - Casimir et Hippolyte
你能解释一下^ |是什么吗?在第一个括号里面做什么? - tgogos
@对立: | 是一个正则表达式的特殊字符,意思是“OR”, ^ 是一个开始的锚点。第一个括号替换单词边界(因为您不能将此功能与希腊字母表一起使用)。第一个括号表示:“行的开头或不是字母的字符(希腊语或拉丁语)”。 - Casimir et Hippolyte
谢谢!我在第一场和第三场比赛中也使用了0-9,因为我正在删除像“2TB”或“mp3”这样的单词。 - tgogos


答案:


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

11
2018-05-04 16:54



您的方法最接近我想要的但有时会删除换行符。 (演示) - tgogos
@antithesis:确实,看到我的编辑,我已经纠正了这个问题。 - Casimir et Hippolyte
你能解释一下^ |是什么吗?在第一个括号里面做什么? - tgogos
@对立: | 是一个正则表达式的特殊字符,意思是“OR”, ^ 是一个开始的锚点。第一个括号替换单词边界(因为您不能将此功能与希腊字母表一起使用)。第一个括号表示:“行的开头或不是字母的字符(希腊语或拉丁语)”。 - Casimir et Hippolyte
谢谢!我在第一场和第三场比赛中也使用了0-9,因为我正在删除像“2TB”或“mp3”这样的单词。 - tgogos


你可以使用\ S.

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

\S

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

如果那样的话  广泛 - 使用独家列表而不是包含列表:

[^\s\.]

那就是 - 任何不是空格的角色  不是一个点。通过这种方式,添加例外也很容易。

不要试图使用\ b

字界限 不使用none-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 展示问题中文本的模式使用。


3
2018-05-05 20:28



感谢您完成的所有工作,但是您可以查看换行符和省略号的一些问题吗? DEMO - tgogos
省略号很容易解释 - 我在答案中添加了排列。新行只需要一个多行标志,我稍后会测试它。看来我已经回答了你的另一个问题 - 请参阅js小提琴。 - AD7six


尝试这样的事情:

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

1
2018-05-04 16:52



如果2个字母单词在句子末尾或后面跟逗号我会猜不到 - donfuxx
你是对的。但对于简单的文本内容,可以轻松添加其他符号/标点,如昏迷,(半)列,点... - disklosr