3

标题可能看起来有点递归,确实如此。

我正在研究一种 Javascript,它可以突出显示/着色 HTML 中显示的 Javascript 代码。因此,在 Internet 浏览器中,注释将变为绿色,定义(for、if、while 等)将变为深蓝色和斜体,数字将变为红色,等等其他元素。然而,着色并不是那么重要。

我试图找出两个不同的正则表达式,它们已经开始引起轻微的头痛。

1. 使用正则表达式查找正则表达式

我想使用 Javascript 在 HTML 的脚本标签中查找正则表达式,例如:

    match(/findthis/i);

,其中正则表达式部分当然是“ /findthis/i ”。

规则如下:

  1. 查找多次出现 (/g) 并不重要。
  2. 它必须在同一行(不是/m)。
  3. 不区分大小写 (/i)。
  4. 如果反斜杠(忽略字符)后面紧跟正斜杠“​​/”,则正斜杠是表达式的一部分,而不是转义字符。例如:/itdoesntstop\/untilnow:/
  5. 两个紧挨着的正斜杠 (//) 是: (A) 开头:不是正则表达式;这是一条评论。(B) 稍后:第一个斜杠是正则表达式的结尾,第二个斜杠只是一个字符。
  6. 正则表达式一直持续到换行符或输入结束 (\n|$),或遇到转义字符(符合规则 4 的第二个正斜杠)。但是,只要在第二个正斜杠之后仅遇到字母字符,它们就被视为正则表达式的一部分。例如:/aregex/allthisispartoftheregex

到目前为止,我得到的是:

    '\\/(?:[^\\/\\\\]|\\/\\*)*\\/([a-zA-Z]*)?'

但是,它并不一致。有什么建议么?

2. 使用正则表达式查找数字(字母数字、浮点数)

自己查找数字很简单。但是,查找浮动数字(带有多个句点)和包括下划线在内的字母更具挑战性。

以下所有内容都被视为数字(每个空格后都有一个新数字):

3 3.1 3.1.4 3a 3.A 3.a1 3_.1

规则:

  1. 查找多次出现 (/g) 并不重要。
  2. 它必须在同一行(不是/m)。
  3. 不区分大小写 (/i)。
  4. 数字必须以数字开头。但是,数字前面或后面可以跟非单词 (\W) 字符。例如:“ =9.9 ;” 其中“9.9”是实际数字。“ a9不是数字。数字之前的句点“ .9 ”不被视为数字的一部分,因此实际数字是“9”。
  5. 允许的字符:[a-zA-Z0-9_.]

我有什么:

'(^|\\W)\\d([a-zA-Z0-9_.]*?)(?=([^a-zA-Z0-9_.]|$))'

它不像我想要的那样工作。

4

1 回答 1

3

对于第一部分,我认为您非常接近。这是我将使用的(作为正则表达式文字,以避免所有双重转义):

/\/(?:[^\/\\\n\r]|\\.)+\/([a-z]*)/i

我不知道你在角色类之后的第二个选择是什么意思。但在这里,第二种选择用于消耗反斜杠以及它们后面的任何内容。最后一部分很重要,这样您就可以识别出以如下形式结尾的正则表达式:/backslash\\/. 你?的正则表达式末尾的 是多余的。否则这应该没问题。

在这里测试一下。

您的第二个正则表达式适合您的规范。虽然有一些多余的元素。您可能想要做的主要事情是捕获除可能的第一个字符之外的所有内容:

/(?:^|\W)(\d[\w.]*)/i

现在实际数字(没有第一个字符)将在捕获组1中。请注意,我删除了不贪婪和前瞻,因为贪婪本身就完全一样。

在这里测试一下。

于 2012-12-05T14:36:34.993 回答