tgo*_*gos 17 javascript regex word-boundary
我\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(' ') );
Run Code Online (Sandbox Code Playgroud)
我在这里提出了2和3的问题:Javascript - 正则表达式 - 如何删除指定长度的单词
编辑
阅读:
Cas*_*yte 13
由于Javascript没有lookbehind功能,并且由于单词边界仅适用于\w角色类的成员,因此唯一的方法是使用组(如果要进行替换,则使用捕获组):
(?m)(^|[^a-zA-Z??-??-?\n])([a-zA-Z??-??-?]{2})(?![a-zA-Z??-??-?])
Run Code Online (Sandbox Code Playgroud)
删除2个字母的示例:
txt = txt.replace(/(^|[^a-zA-Z??-??-?\n])([a-zA-Z??-??-?]{2})(?![a-zA-Z??-??-?])/gm, '\1');
Run Code Online (Sandbox Code Playgroud)
与其写一个“单词字符加这些字符”的匹配项,不如使用一个匹配非空格的正则表达式:
\S
Run Code Online (Sandbox Code Playgroud)
它的范围更广,但更易于编写/使用。
如果范围太广,请使用排除列表,而不要使用包含列表:
[^\s\.]
Run Code Online (Sandbox Code Playgroud)
那就是-不是空格的任何字符,并没有一个点。这样,添加例外也很容易。
单词边界不适用于无字母字符,这很容易证明:
> "yay".match(/\b.*\b/)
["yay"]
> "?a?".match(/\b.*\b/)
["a"]
Run Code Online (Sandbox Code Playgroud)
因此,无法\b检测带有希腊字符的单词-每个字符都是匹配的边界。
以下模式可用于匹配两个字符词:
pattern = /(^|[\s\.,])(\S{2})(?=$|[\s\.,])/g;
Run Code Online (Sandbox Code Playgroud)
(更准确地说:匹配两个非空白序列)。
那是:
(^|[\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)
Run Code Online (Sandbox Code Playgroud)
可以像这样使用该模式来删除匹配的单词:
"input string".replace(pattern);
Run Code Online (Sandbox Code Playgroud)
这是一个jsfiddle,演示了在问题文本中使用的模式。
| 归档时间: |
|
| 查看次数: |
13269 次 |
| 最近记录: |