2017-02-27 44 views
2

我想用Javascript(node.js)標記句子中的單詞,刪除非單詞字符(點,逗號,句號,問號等) ,考慮到UTF-8(英文,拉丁文,希臘文,西里爾文,日文等)和數字中的所有現有字母表,這意味着我需要一種方法來了解某個字符是單詞的一部分還是符號。例如:在UTF-8中用單詞以UTF-8編碼句子用特殊字符

españa.es 4*5 Rußland Citroën, 東京 iphone-pro5

應返回的數組:

[españa, es, 4, 5, Rußland, Citroën, 東京, iphone, pro5]

我使用以下正則表達式:

[0-9A-Za-zªº\u00B5\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02AF\u02B0-\u02C1\u0370-\u0374\u0376-\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03FF\u0400-\u0481\u048A-\u0523]+

0-9A- ZA-Z(數字和英文字母ERS)

ªº(順序的指標)

\ u00B5(微符號)

\ u00C0- \ u00D6 \ u00D8- \ u00F6 \ u00F8- \ u02AF(非英語拉丁字母)

\ u02B0- \ u02C1(改性劑字母)

\ u0370- \ u0374 \ u0376- \ u0377 \ u037A- \ u037D \ u0386 \ u0388- \ u038A \ u038C \ u038E- \ u03A1 \ u03A3- \ u03FF(希和科普特字母)

\ u0400- \ u0481 \ u048A- \ u0523(西裏爾字母)

是否有其他更容易或更完整地在文本分割的話嗎?

+0

使用XRegExp:https://jsfiddle.net/uhwt8e4k/ –

+0

爲什麼不只是通過非單詞字符(它們在所有語言中都是相同的)而不是匹配單詞字符進行分割? – hindmost

+0

@最後,它不是那麼容易,例如'\ u00D7(×)','\ u00F7(÷)','\ u1f600()','1f4a9()'是符號,不能是字的一部分在UTF-8中有很多這些符號) – greuze

回答

3

這是很容易與XRegExp

var s = "españa.es 4*5 Rußland Citroën, 東京 iphone-pro5"; 
 
var r = XRegExp("[\\pL\\pN]+", "g"); 
 
var results = XRegExp.match(s, r); 
 
console.log(results);
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.min.js"></script>

[\\pL\\pN]+正則表達式模式匹配的一個或多個Unicode字母(\pL)或數字(\pN)。

+0

XRegExp只是在幕後做一個類似拉長的正則表達式(就像OP已經使用的那樣),所以真的不值得把整個庫拉到縮短的範圍內字符串恕我直言。 – mscdex

+0

@mscdex:當然,如果你不想拉入整個庫,你可以使用該庫中的'\ pL'和'\ pN'構造。 –

+0

'\ pL'中使用的標準正則表達式可以在https://github.com/slevithan/xregexp/blob/v3.1.1/xregexp-all.js#L1750 – greuze