正则表达式,除了空格或冒号以外的每个非字母数字字符

215

如何在任何地方执行此操作?

基本上,我正在尝试匹配各种杂项字符,例如&、分号、美元符号等。


21
这是一个正则表达式,用于匹配除了字母、数字、空格和冒号以外的所有字符。 - Kelly
/[^a-zA-Z0-9\s:]+/ - 你的星星匹配为0 - Jason
11个回答

389
[^a-zA-Z\d\s:]
  • \d - 数字类别
  • \s - 空白字符
  • a-zA-Z - 匹配所有字母
  • ^ - 取反 - 因此匹配非数字字符、非空格和非冒号。

这正是我也在看的:)) - 我必须推广你的完美答案。 - Tudor Constantin
24
我发现的唯一一件事就是这会移除像é或者ã这样的特殊字符。我更喜欢使用[^\w\d\s:]。 - Eric Belair
13
因为这个方法不能识别非拉丁字符和“特殊”的拉丁字符,所以被踩了。 - damian
1
\d\s是Perl扩展,通常不受像grepsedtrlex等旧工具的支持。 - tripleee
1
另一个答案只适用于没有重音的英语或其他拉丁语系语言。我认为世界比那大一点 :). 已被踩。 - MS Berends
为了反驳对这个答案的批评,我的意图是找到所有的“特殊”非ASCII字符,所以这个方法完美地实现了我的目的。 - undefined

47

这应该可以解决:

[^a-zA-Z\d\s:]

1
其他的程序检查空格但不检查空白,或者否定位置错误而无法实际否定。 - Zachary Scott
\w 包括下划线,因此它也是一个非字母数字字符。 - Tudor Constantin
啊哈!我应该修改一下——我不知道那个。我预计它对于不同的引擎有不同的工作方式,但最好给出安全的答案。 - Luke Sneeringer
5
因为这个方法不能识别非拉丁字符或者"特殊"拉丁字符,所以被踩了。 - damian
@damian,请查看https://dev59.com/oG025IYBdhLWcg3wW0ux#73853673 - MS Berends

29
如果您想将带重音的拉丁字符(例如 à Ñ)视为普通字母(即避免匹配它们),则还需要在正则表达式中包含适当的Unicode范围(\u00C0-\u00FF)。因此,正则表达式应该像这样: \u00C0-\u00FF
/[^a-zA-Z\d\s:\u00C0-\u00FF]/g
  • ^ 反转其后的匹配
  • a-zA-Z 匹配大小写字母
  • \d 匹配数字
  • \s 匹配空白字符(如果您只想匹配空格,请将其替换为一个空格)
  • : 匹配冒号
  • \u00C0-\u00FF 匹配带音调的拉丁字符的Unicode范围。

注意:Unicode范围匹配可能不适用于所有的正则表达式引擎,但上述内容在JavaScript中肯定是可行的(如在Codepen上的这个demo中所见)。

注2:如果您不关心匹配下划线,可以将a-zA-Z\d替换为\w,它会匹配字母、数字和下划线。


这个范围包含一些非字母数字字符(U+00D7和U+00F7),并排除了许多来自波兰语、捷克语、越南语等非西方语言的有效重音字符。 - tripleee
1
为正则表达式的每个部分的描述点赞。 - morajabi

16

试一下这个:

[^a-zA-Z0-9 :]

JavaScript 示例:

"!@#$%* ABC def:123".replace(/[^a-zA-Z0-9 :]/g, ".")

查看在线示例:

http://jsfiddle.net/vhMy8/


5
因为这个方法无法识别非拉丁字符和"特殊" 拉丁字符,所以被投反对票。 - damian
22
很容易对一个回答进行负面投票,但更难向讨论板提供建设性信息,例如,如何捕捉非拉丁字符或“特殊”拉丁字符?据我所知,在这里你已经因为同样的原因将3个答案投下了反对票,而根据我的看法,这只是一个相当小的调整。例如,我在这里寻找一个正则表达式,用于精确描述这些答案中讨论的内容。我不关心在我的应用程序中不会使用的字符集。收益递减定律。 - user3842449
2
对于美国公民来说,Aaron可能只是一个“小调整”,但对于这个星球的其他地方来说却非常重要。 - Michael K. Borregaard
2
[^a-zA-Z0-9 :] can be replaced with [^\w:] - Moses Schwartz
\w 包括下划线,所以要注意。 - Alter Lagos
@ user3842449 “我不关心在我的应用程序中不会使用的字符集。” 嗯,这很自我中心。此外,OP的问题是要删除空格,因此这应该回答了这个问题。对于几乎所有非英语语言,这并不适用。 - MS Berends

7
在JavaScript中: /[^\w_]/g ^ 表示取反,即选择任何不在以下集合中的内容 \w 表示任何单词字符(即任何字母数字字符,加上下划线) _ 取反下划线,因为它被视为“单词”字符
用法示例 - const nonAlphaNumericChars = /[^\w_]/g;

5
[^\w_][^\w]相同(因为_也是单词字符),并等同于\W - Wiktor Stribiżew

5

不允许使用字母数字、空格或下划线。

var reg = /[^\w\s)]|[_]/g;

5
如果您指的是“非字母数字字符”,请尝试使用以下内容:
var reg =/[^a-zA-Z0-9]/g      //[^abc]

1
以前的解决方案似乎只适用于没有重音等拉丁语系英语或其他语言。因此,这些答案并不适用于回答问题。
根据维基百科上的空格字符文章,这些都是Unicode中的所有空格字符:
U+0009、U+000A、U+000B、U+000C、U+000D、U+0020、U+0085、U+00A0、U+1680、U+180E、U+2000、U+2001、U+2002、U+2003、U+2004、U+2005、U+2006、U+2007、U+2008、U+2009、U+200A、U+200B、U+200C、U+200D、U+2028、U+2029、U+202F、U+205F、U+2060、U+3000、U+FEFF
因此,在我看来,最包容性的解决方案可能会很慢,但这是关于准确性的问题。
\u0009\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u200C\u200D\u2028\u2029\u202F\u205F\u2060\u3000\uFEFF

因此,要回答 OP 的问题并包括“除空格或冒号之外的每个非字母数字字符”,请在前面加上一个脱字符 ^包括上述字符,并将冒号添加到其中,然后用 [] 将正则表达式括起来,以指示它匹配“这些字符中的任何一个”:
"[^:\u0009\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u200C\u200D\u2028\u2029\u202F\u205F\u2060\u3000\uFEFF]"

Debuggex演示


奖金:R的解决方案
trimws2 <- function(..., whitespace = "[\u0009\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u200C\u200D\u2028\u2029\u202F\u205F\u2060\u3000\uFEFF]") {
  trimws(..., whitespace = whitespace)
}

这甚至比trimws()本身更快,trimws()将设置为" \t\n\r"。
microbenchmark::microbenchmark(trimws2(" \t\r\n"), trimws(" \t\r\n"))
#> Unit: microseconds
#>                   expr    min     lq     mean  median      uq     max neval cld
#>  trimws2(" \\t\\r\\n") 29.177 29.875 31.94345 30.4990 31.3895 105.642   100  a 
#>   trimws(" \\t\\r\\n") 45.811 46.630 48.25076 47.2545 48.2765 116.571   100   b

1
这个正则表达式适用于C#, PCREGo等编程语言。根据RegexBuddy的说法,它在Chrome上的JavaScript中不起作用。但是这里已经有一个例子了。
其中主要部分是: \p{L} 它表示任何语言的任何字母,即\p{L}\p{Letter}

完整的正则表达式本身: [^\w\d\s:\p{L}]

示例: https://regex101.com/r/K59PrA/2


这是唯一一个正确处理Unicode重音字母的答案。遗憾的是,并非所有的正则表达式引擎都支持此功能(即使Python缺乏它,截至3.8版本,尽管其正则表达式引擎基于PCRE)。 - tripleee
1
我会从答案中删除Python,我以为我测试过了,但显然没有。谢谢你指出来。 - Ste

-3

尝试添加这个:

^[^a-zA-Z\d\s:]*$

这对我有用... :)


2
这似乎重复了2011年的被接受答案。^$锚定它匹配整行,*量词意味着它也匹配空行。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接