2011-09-28 28 views
18

Tôi cần cụm từ thông dụng để khớp với tất cả các dấu chấm câu, chẳng hạn như tiêu chuẩn [,! @ # $%^& *()], nhưng bao gồm các dấu hiệu quốc tế như dấu chấm hỏi Tây Ban Nha, thời Trung Quốc, v.v. Google-fu của tôi sắp xuất hiện. Có ai có một biểu hiện thường xuyên trên tay đó là tương thích với Javascript?Biểu thức chính quy Javascript cho dấu chấm câu (quốc tế)?

+1

Xem xét làm thế nào xấu của regex Javascript và unicode hỗ trợ được, tôi không nghĩ rằng có bất cứ điều gì khác hơn là liệt kê tất cả các ký tự mà bạn muốn bao gồm. – NullUserException

+4

PS: Khi nào '@ # $%^& *' trở thành dấu chấm câu? – NullUserException

+1

kể từ khi hai mắt xuất hiện bắt đầu xuất hiện ở cuối tên :-) – RHT

Trả lời

7

Nếu bạn có thể sử dụng plugin, có plugin cho JavaScript: XRegExp Unicode plugins. Điều đó cho biết thêm hỗ trợ cho các loại Unicode, kịch bản, và các khối (cá nhân tôi chỉ đọc về nó, tôi không bao giờ sử dụng nó).

Với plugin này, bạn có thể sử dụng các danh mục Unicode như \p{P} như được giải thích tại regular-expressions.info.

Cập nhật: OK, tôi đã thử nghiệm và dường như hoạt động tốt.

Bạn cần tải lib từ XRegExp và bổ sung các plugin Unicode Base và Unicode Category (được liên kết ở trên).

<script src="xregexp.js"></script> 
<script src="addons/unicode-base.js"></script> 
<script src="addons/unicode-categories.js"></script> 
<script> 
    var unicodePunctuation = XRegExp("^\\p{P}+$"); 

    alert(unicodePunctuation.test("?.,;!¡¿。、·")); // true 
</script> 

Các cảnh báo trên true. Tôi đã bao gồm một số dấu câu tiếng Tây Ban Nha và tiếng Trung trong chuỗi thử nghiệm của mình, "?.,;!¡¿。、·".

+0

Điều này có vẻ khá hứa hẹn, mặc dù tôi luôn do dự khi làm nổi bật ứng dụng Javascript của tôi với một thư viện khác. Tôi sẽ kiểm tra lại sau khi tôi xác nhận nó hoạt động cho mục đích của tôi. –

+0

Cảm ơn bạn. Đây là mã JSBin (cuộn xuống dưới cùng và xem bảng điều khiển của Chrome) http://jsbin.com/uFiNeDOn/3/edit?js,console –

2

Vâng ... idk cách mở rộng nó sẽ được, nhưng bạn có thể sử dụng này:

[^\w\s\n\t] 
+0

Điều duy nhất về điều này là ký tự '_' được bao gồm trong' \ w' . Ngoài ra, sẽ unicode chữ cái (như 'ö') được cho phép thông qua, như là dương tính giả? – sdleihssirhc

+2

'\ s' bao gồm cả' \ n' và '\ t', và điều này cũng khớp với các ký tự từ không phải ASCII, ký tự điều khiển, ký tự tiền tệ và các loại ký tự không dấu câu khác. –

+0

Các ký tự unicode khác được đưa vào là dương tính giả là vấn đề chính hiện tại của tôi - tôi đoán một vấn đề tương đương đối với tôi là tìm một regex tốt tương đương với quốc tế \ w (và do đó \ W) –

2

regex của bạn sẽ trông giống như ...

/[,[email protected]#$%^&*()\u9999]/ 

đâu bạn thay thế mỗi \u9999 với bảng mã Unicode cho các ký tự dấu câu khác.

Nếu bạn có thể tìm thấy một nhóm trong phạm vi , bạn có thể chỉ định rằng với toán hạng phạm vi -, ví dụ: \u9990-\u9999.

Theo như tôi biết, bạn không thể sử dụng một cái gì đó như \pP trong các biểu thức JavaScript.

+0

Bạn sẽ không cần phải làm cá nhân ký tự - bạn vẫn có thể thực hiện các phạm vi như '[\ u9000- \ u9999]' (đó là một ví dụ cú pháp, không biết các ký tự nào có thể đại diện). –

+1

@PeterBoughton: Tôi chỉ chỉnh sửa điều đó trong :) – alex

6

Thêm vào câu trả lời của @ stema (https://stackoverflow.com/a/7578937/114140) ... đây là regex dưới dạng chuỗi (vì vậy bạn không cần phải làm cho dự án của bạn bị xáo trộn bằng XRegExp).

!-#%-\x2A,-/:;\[email protected]\x5B-\x5D_\x7B}\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E3B\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65 

tôi đã sử dụng này trong dự án của riêng tôi với một số bổ sung ...

// any kind of punctuation character (including international e.g. Chinese and Spanish punctuation) 
    // author: http://www.regular-expressions.info/unicode.html 
    // source: https://github.com/slevithan/xregexp/blob/41f4cd3fc0a8540c3c71969a0f81d1f00e9056a9/src/addons/unicode/unicode-categories.js#L142 
    // note: XRegExp unicode output taken from http://jsbin.com/uFiNeDOn/3/edit?js,console (see chrome console.log), then converted back to JS escaped unicode here http://rishida.net/tools/conversion/, then tested on http://regexpal.com/ 
    // suggested by: https://stackoverflow.com/a/7578937 
    // added: extra characters like "$", "\uFFE5" [yen symbol], "^", "+", "=" which are not consider punctuation in the XRegExp regex (they are currency or mathmatical characters) 
    // added: \u3000-\u303F Chinese Punctuation for good measure 
    var regex_characters_to_remove = /[\$\uFFE5\^\+=`~<>{}\[\]|\u3000-\u303F!-#%-\x2A,-/:;\[email protected]\x5B-\x5D_\x7B}\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E3B\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]+/g 
0

Đối với Python regex này để loại bỏ ngay từ đầu và kết thúc bất kỳ loại dấu chấm câu:

import re 
def cleanspecialcharacters(str): 
    regex = re.compile((
    '^[/\"_\(\)&*\$¥\^\+=`~<>\{\}\[\]\|\-!#%\,\:;@¡§«¶·»¿;·՚-՟։֊؉،॥॰෴๏๚๛༄-༒༔༺-༽྅჻፠-፨᐀᙭᙮។-៖៘-៚‧‰-⁃⁅-⁑⁓-⁞⁽⁾₍₎、〃〈-【】〔-〟〰〽゠・﴾﴿︐-︙︰-﹒﹔-﹡﹣﹨﹪﹫!-#%-*,-/:;?@[-]_{}⦅-・〔〕《》]*|' 
    '([/\"_\(\)&*\$¥\^\+=`~<>\{\}\[\]\|\-!#%\,\:;@¡§«¶·»¿;·՚-՟։֊؉،॥॰෴๏๚๛༄-༒༔༺-༽྅჻፠-፨᐀᙭᙮។-៖៘-៚‧‰-⁃⁅-⁑⁓-⁞⁽⁾₍₎、〃〈-【】〔-〟〰〽゠・﴾﴿︐-︙︰-﹒﹔-﹡﹣﹨﹪﹫!-#%-*,-/:;?@[-]_{}⦅-・〔〕《》])*$')) 
    str = regex.sub('', str) 
    return str 
Các vấn đề liên quan