gpt4 book ai didi

javascript - 如何在 JavaScript 中匹配一系列字符的正则表达式中添加反引号?

转载 作者:行者123 更新时间:2023-11-28 15:27:54 26 4
gpt4 key购买 nike

想象我有字符串

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) 范围,因此您必须意识到连字符可以是“字符类”(方括号中包含的字符的名称)中的特殊字符) 创建两个有效字符之间的范围。但是,最后三个字符也在空格和反引号 ( -`) 之间创建一个范围,而不是显式搜索连字符和反引号。

因此,如果您想专门查找连字符,则需要执行以下操作之一:

  1. 不要将其放在两个有效字符之间。这意味着,将其放置在开头、结尾、另一个范围之后等。
  2. 逃避它。

以下是一些示例,以及修复后的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com