21

\b在正则表达式中使用和希腊字符有困难。

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

使用的文字:

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

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

英语:事实上,在你们国家和我们国家都在讲述的故事,曾几何时,赫利俄斯的儿子法厄同如何驾驭他父亲的战车,因为他无法驾驶它沿着他父亲的路线行驶, 烧毁了地球上的一切,他自己也被雷击灭亡——这个故事,正如它所讲述的那样,具有传奇色彩,但它的真实性在于天体发生了移动它们在地球周围移动,并用猛烈的火焰摧毁地球上的事物,这种火焰会在很长一段时间内重复发生。

到目前为止我已经尝试过:

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

编辑

另请阅读:

4

3 回答 3

14

由于 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');
于 2014-05-04T16:54:26.330 回答
7

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

于 2014-05-05T20:28:44.807 回答
0

尝试这样的事情:

\s[a-zA-ZΆΈ-ώἀ-ῼ]{2}\s
于 2014-05-04T16:52:52.667 回答