正则表达式删除非字母字符但保留重音字母

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本人的回答:

正则表达西班牙语和阿拉伯语


nal*_*ply 9

注意!仅适用于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)


soc*_*a23 8

您可以尝试将非法字符列入黑名单,而不是将您接受的字符列入白名单:

var desired = stringToReplace.replace(/[-'`~!@#$%^&*()_|+=?;:'",.<>\{\}\[\]\\\/]/gi, '')
Run Code Online (Sandbox Code Playgroud)