想象我有字符串
asdf-'`
我想使用正则表达式验证是否正常。
即字母字符、连字符、撇号和反引号。
除了以下示例中的反引号之外,一切正常:
html:
Type something here: <input type="text" id="in">
<div id="out"></div>
JavaScript:
var $out = $("#out");
$("input").keyup(function () {
if (/^[a-zA-Z ' -`]+$/.test(this.value))
$out.text("Regex tested OK");
else
$out.text("Regex tested not OK");
});
结果:
Type something here: asdf-'`
Regex tested not OK
我的问题是:如何向 JavaScript 中匹配的一系列字符的正则表达式添加反引号? (关于反引号的其他正则表达式问题似乎没有解决这个问题)。
最佳答案
您的答案
首先,正则表达式确实有效,只是不是你想象的那样。 我稍后会在下面的水平规则下讨论这个问题。
您的问题不在于反引号,而在于其前面的连字符。由于您使用连字符来创建 (a-z)
和 (A-Z)
范围,因此您必须意识到连字符可以是“字符类”(方括号中包含的字符的名称)中的特殊字符) 创建两个有效字符之间的范围。但是,最后三个字符也在空格和反引号 ( -`)
之间创建一个范围,而不是显式搜索连字符和反引号。
因此,如果您想专门查找连字符,则需要执行以下操作之一:
- 不要将其放在两个有效字符之间。这意味着,将其放置在开头、结尾、另一个范围之后等。
- 逃避它。
以下是一些示例,以及修复后的 jsfiddle ( http://jsfiddle.net/a4vGA/63/ ):
// Personally, I like #2. Escaping the hyphen just reads much nicer to me:
/^[a-zA-Z' \-`]+$/ // The searchable hyphen char is escaped, breaking the range.
// But any of these all make the searchable hyphen work without escaping:
/^[a-zA-Z' `-]+$/ // The searchable hyphen char is last
/^[-a-zA-Z' `]+$/ // The searchable hyphen char is first
/^[a-z-A-Z' `]+$/ // The searchable hyphen char is between two ranges and,
// therefore, cannot create a range
/^[a-zA-Z-' `]+$/ // The searchable hyphen char is after a range and and,
// therefore, cannot create a range
// etc.
以上任何一项都可以回答您的问题。您可以在这里停止阅读!
<小时/>为什么它之前有效?
您的问题很有趣,因为您在问题中粘贴的正则表达式确实可以使用您粘贴的字符串 asdf-'`
。
/^[a-zA-Z ' -`]+$/.test("asdf-'`") // true; but not why you may think.
(注意:问题中粘贴的正则表达式中的 jsfiddle from your comments simply had a typo 意外地省略了反引号,这导致测试字符串失败。)
那么,正如我们上面所讨论的,如果这个表达式的连字符创建了三组范围并且没有显式搜索连字符,为什么它仍然有效?让我们分解一下表达式,看看发生了什么。
您粘贴的表达式 ^[a-zA-Z ' -`]+$
将匹配从行开头到结尾的任何字符序列:
-
(a-z)
作为范围,或以下任何字符:abcdefghijklmnopqrstuvwxyz
-
(A-Z)
作为范围,或以下任何字符:ABCDEFGHIJKLMNOPQRSTUVWXYZ
-
( )
一个空格字符 -
(')
单引号字符 -
( -`)
作为范围反引号的空格,或以下任何字符:!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `
如您所见,最后三个字符 ( -`)
创建了一个从 unicode 0020(空格)到 0060(反引号)的范围,包括所有数字、大写字母、一些特殊字符和...连字符本身!这就是为什么你的字符串( asdf-'`
)实际上匹配。
不幸的是,许多其他包含这些字符的字符串也是如此: 12ab34$!-'`
、 #!/a b?&
等。
/^[a-zA-Z ' -`]+$/.test("asdf-'`") // true
/^[a-zA-Z ' -`]+$/.test("!@#-456") // true
/^[a-zA-Z ' -`]+$/.test("012#$%678") // true
/^[a-zA-Z ' -`]+$/.test("<a:5:c>") // true
所以,是的,请确保转义(或按照水平规则上面的描述移动连字符)以避免创建范围!
关于javascript - 如何在 JavaScript 中匹配一系列字符的正则表达式中添加反引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28469240/