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

标签 javascript regex

想象我有字符串

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/

相关文章:

javascript - 遍历名称列表并在点击监听器上添加 Jquery

javascript - 在ftl文件中编写javascript

php - 找出哪个页面正在调用 PHP 中的一段 JavaScript

c# - 复杂的正则表达式或字符串解析

python - 在python中排序

javascript - 以字母 'c' 或 'r' 开头的正则表达式

javascript - 从withHandlers中的withReducer中检索重构本地调度函数

html - 使用 VBA 从谷歌翻译中提取 div 的内容

c# - 在这种情况下如何使用 Regex.Replace?

javascript - 在 Google map 的 JS API 中,根据事件, fromPointToLatLng 似乎不准确