dev*_*s11 12 javascript regex string diacritics
我有西班牙语和其他语言的字符串,可能包含通用的特殊字符,如(),*等.我需要删除.但问题是它也可能包含特殊的语言字符,如ñ,á,ó,í等,它们需要保留.所以我试图通过以下方式使用regexp:
var desired = stringToReplace.replace(/[^\w\s]/gi, '');
Run Code Online (Sandbox Code Playgroud)
不幸的是,它删除了所有特殊字符,包括相关语言.不知道如何避免这种情况.也许有人会建议?
Tim*_*own 12
我建议使用Steven Levithan出色的XRegExp库及其Unicode插件.
这是一个从字符串中删除非拉丁字符的示例:http://jsfiddle.net/b3awZ/1/
var regex = XRegExp("[^\\s\\p{Latin}]+", "g");
var str = "¿Me puedes decir la contraseña de la Wi-Fi?"
var replaced = XRegExp.replace(str, regex, "");
Run Code Online (Sandbox Code Playgroud)
请参阅Steven Levithan本人的回答:
注意!仅适用于16位代码点.这个答案是不完整的.
所有阿拉伯数字和拉丁字母的字符类是:[0-9A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02af\u1d00-\u1d25\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1d9a\u1e00-\u1eff\u2090-\u2094\u2184-\u2184\u2488-\u2490\u271d-\u271d\u2c60-\u2c7c\u2c7e-\u2c7f\ua722-\ua76f\ua771-\ua787\ua78b-\ua78c\ua7fb-\ua7ff\ufb00-\ufb06].
要获得正则表达式,您可以使用,前置/^和追加+$/.这将匹配仅由拉丁字母和数字组成的字符串,如"mérito"或"Schönheit".
要匹配非数字或非字母字符以删除它们,请^在[左括号后面/添加第一个字符并添加前缀和后缀+/.
我是怎么发现的?继续阅读.
因为Javascript没有Unicode正则表达式,所以我编写了一个Python程序来迭代整个Unicode并按Unicode名称进行过滤.很难手动完成这项工作.为什么不让电脑做脏兮兮的工作呢?
import unicodedata
import re
import sys
def unicodeNameMatch(pattern, codepoint):
try:
return re.match(pattern, unicodedata.name(unichr(codepoint)), re.I)
except ValueError:
return None
def regexChr(codepoint):
return chr(codepoint) if 32 <= codepoint < 127 else "\\u%04x" % codepoint
names = sys.argv
prev = None
js_regex = ""
for codepoint in range(pow(2, 16)):
if any([unicodeNameMatch(name, codepoint) for name in names]):
if prev is None: js_regex += regexChr(codepoint)
prev = codepoint
else:
if not prev is None: js_regex += "-" + regexChr(prev)
prev = None
print "[" + js_regex + "]"
Run Code Online (Sandbox Code Playgroud)
像这样调用它:python char_class.py latin digit你得到上面提到的字符类.这是一个丑陋的char类,但你肯定知道你抓住了名字包含latin或的所有字符digit.
浏览Unicode字符数据库以查看所有unicode字符的名称.在第一个分号后面的名称是大写的,例如A它的行
0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061;
Run Code Online (Sandbox Code Playgroud)
尝试python char_class.py "latin small"并获得所有拉丁小写字母的字符类.
编辑:\u271d-\u271d在正则表达式中发生了一个小错误(也就是错误).也许此修复有助于:替换
if not prev is None: js_regex += "-" + regexChr(prev)
Run Code Online (Sandbox Code Playgroud)
通过
if not prev is None and prev != codepoint: js_regex += "-" + regexChr(prev)
Run Code Online (Sandbox Code Playgroud)
您可以尝试将非法字符列入黑名单,而不是将您接受的字符列入白名单:
var desired = stringToReplace.replace(/[-'`~!@#$%^&*()_|+=?;:'",.<>\{\}\[\]\\\/]/gi, '')
Run Code Online (Sandbox Code Playgroud)