在正则表达式字符集中包含连字符?

92
$.validator.addMethod('AZ09_', function (value) { 
    return /^[a-zA-Z0-9.-_]+$/.test(value); 
}, 'Only letters, numbers, and _-. are allowed');

当我使用类似于test-123这样的字符时,它仍然会触发无效连字符的提示。我尝试过\---


1
我的问题是我实际上使用的是AZ09方法而不是AZ09_..gr方法。 - ParoX
7个回答

142

使用 \- 进行转义应该没问题,但你也可以尝试将其放在字符集的开头或结尾。这样对你有用:

使用 \- 进行转义应该没问题,但你也可以尝试将其放在字符集的开头或结尾。这样对你有用:

/^[a-zA-Z0-9._-]+$/

2
将连字符放在最后在某些 Microsoft 工具中不起作用,例如 Microsoft SQL Server Management Studio。转义连字符是有效的。 - Ross Presser
1
@SabaAhang 因为如果它在开头或结尾,它就不能在两个其他字符之间创建一系列字符(例如 [0-9])。 - Matt
2
@SabaAhang 以下文档页面提到连字符可以在字符括号的开头或结尾不转义:http://www.regular-expressions.info/charclass.html - AbstractVoid

41

使用 \- 转义连字符是正确的方式。

我已验证表达式 /^[a-zA-Z0-9.\-_]+$/ 允许使用连字符。您也可以使用 \w 类来缩短它为 /^[\w.\-]+$/

(在表达式中将连字符放在最后实际上会导致它不需要转义,因为它不能成为范围的一部分,然而您可能仍然希望养成始终转义的习惯。)


非常好。:D 虽然我觉得可读性更好(我猜 \w 对一些专家来说很容易)。 - ParoX
将连字符放在最后在某些 Microsoft 工具中不起作用,例如 Microsoft SQL Server Management Studio。转义连字符是有效的。 - Ross Presser

4
通常情况下,在正则表达式中使用连字符(-)时,重要的是要注意转义(\-)和不转义(-)连字符之间的区别,因为除了作为字符本身外,连字符还被解析为指定正则表达式范围的符号。
在第一种情况下,使用转义连字符(\-),正则表达式只会匹配连字符,例如:/^[+\-.]+$/ 在第二种情况下,不需要转义,例如:/^[+-.]+$/,因为连字符位于加号和句点之间,所以它将匹配ASCII值在43(加号)和46(句点)之间的所有字符,因此会包括逗号(44的ASCII值)作为副作用。

4

也许出现问题是因为您向服务器传递了一个字符串,没有正确转义其中的字符。如果是这种情况,您应该首先转义\,以便服务器端程序也能够处理它。

  • 在服务器端字符串中: \\-
  • 在客户端中: \-
  • 在正则表达式中(涵盖): -

或者您可以将其简单地放在[]方括号的末尾。


我需要在服务器端使用C#。它起作用了。谢谢。 - Topman
1
@Topman 更好的做法(对于C#),是使用verbatim string literals来处理服务器端的正则表达式、文件名等,以避免混淆(@"\"代替"\\")。 - MarredCheese

2

\-应该可以用来转义字符范围中的-。当它似乎不起作用时,你能引用一下你测试的内容吗?因为它似乎是有效的:http://jsbin.com/odita3


1
一种更通用的匹配连字符的方法是使用连字符和短划线的字符类("\p{Pd}"不带引号)。 如果您处理来自各种文化和来源的文本,可能会发现那里有更多类型的连字符,而不仅仅是一个字符。 您可以将其添加到[]表达式中。

-1
尽管在大多数情况下,被接受的答案都很好,但在处理HTML/CSS验证字段时,我发现一些问题,即使是转义字符,不仅包括连字符,还包括其他字符,如空格(\s)或点号(.)。 通常一个单独的转义字符\-就可以解决问题,但在验证中似乎需要双重转义,即转义转义的反斜杠:\\-

2023年12月7日更新:必须对正则表达式保留字符进行双重转义似乎与使用JS编译器(在我的情况下是Ember-cli)有关。在CodePen中,单个转义字符运行良好。

希望这对某人有所帮助。


请参见为什么正则表达式构造函数需要双重转义?。这似乎并不相关。 - Sebastian Simon
查看为什么正则表达式构造函数需要双重转义?。这似乎与问题无关。 - undefined
@Sebastian Simon,也许在拍摄之前你应该先问一下... 是的,我确实没有说明我描述的问题是与HTML模式相关的,但是用否定的语言说不相关我认为有些过分。很多用户可能通过谷歌搜索来到这里,寻找答案,尽管他们没有通过JS进行验证,而是使用HTML模式正则表达式,你为什么认为我的贡献对他们没有用处呢? - Daniel Abril
@Sebastian Simon,也许在拍摄之前你应该先问一下……确实,我没有明确说明我描述的问题是关于HTML模式的,但是用否定的方式说它不相关,我觉得有点过分。许多用户可能通过谷歌搜索来到这里,寻找答案,尽管他们不是通过JS进行验证,而是通过HTML模式的正则表达式,你为什么认为我的贡献对他们没有用呢? - undefined

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