匹配由特定字符组成的单词,不包括特殊括号之间

pit*_*mer 7 javascript regex string match

我正在尝试匹配仅包含此字符类中的字符的单词: [A-z'\\/%]不包括以下情况:

  • 他们在<和之间>
  • 他们在[和之间]
  • 他们在{和之间}

所以,假设我有这个有趣的字符串:

[beginning]<start>How's {the} /weather (\\today%?)[end]
Run Code Online (Sandbox Code Playgroud)

我需要匹配以下字符串:

[ "How's", "/weather", "\\today%" ]
Run Code Online (Sandbox Code Playgroud)

我试过使用这种模式:

/[A-z'/\\%]*(?![^{]*})(?![^\[]*\])(?![^<]*>)/gm
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它匹配:

[ "[beginning]", "", "How's", "", "", "", "/weather", "", "", "\\today%", "", "", "[end]", "" ]
Run Code Online (Sandbox Code Playgroud)

我不确定为什么我的模式允许[和之间的东西],因为我使用了(?![^\[]*\]),并且类似的方法似乎适用于匹配{these cases}<these cases>。我也不确定为什么它匹配所有空字符串。

有什么智慧吗?:)

Ahm*_*eed 4

您的模式本质上存在两个问题:

  1. 如果您只想匹配字母,切勿在字符类中使用A-z(因为它将匹配多个字母1)。相反,请使用a-zA-Z(或A-Za-z)。

  2. *在字符类后面使用量词将允许空匹配。请改用+量词。

所以,固定模式应该是:

[A-Za-z'/\\%]+(?![^{]*})(?![^\[]*\])(?![^<]*>)
Run Code Online (Sandbox Code Playgroud)

演示


1 字符[A-z]类的意思是“匹配 ASCII 代码在 65 到 122 之间的任何字符”。问题在于 91 到 95 之间的代码不是字母(这就是原始模式匹配“[”和“]”等字符的原因)。