Javascript正则表达式:匹配任何东西直到某些东西(如果它存在)

und*_*ror 17 javascript regex negative-lookahead

嗨,我是正则表达式的新手,这可能是一个非常简单的问题(希望如此).

我试图使用一种解决方案3种字符串

  • "45%",预期结果:"45"
  • "45",预期结果:"45"
  • "", 预期结果: ""

我在尝试什么(让字符串为str):

str.match(/(.*)(?!%*)/i)[1]
Run Code Online (Sandbox Code Playgroud)

在我的脑海中听起来像"匹配任何事物的任何实例,直到'%'如果找到它,或者只是匹配任何东西"

在萤火虫的头脑中,它似乎听起来更像是"只是匹配任何东西而完全无视负面前瞻".也是为了让它变得懒惰 - (.*)?似乎没有帮助.

让我们忘记一下,在这种特殊情况下,我只是匹配数字,所以/\d*/我会这样做.我试图了解一般规则,以便我可以随时应用它.

有人会这么善意帮助我吗?

ken*_*ytm 27

怎么样更简单

str.match(/[^%]*/i)[0]
Run Code Online (Sandbox Code Playgroud)

这意味着,匹配零或多个字符,这不是一个%.


编辑:如果需要解析到</a>,那么你可以分析一个序列PF字符,其次</a>,然后再丢弃</a>,这意味着你应该使用积极前瞻的,而不是消极的.

str.match(/.*?(?=<\/a>|$)/i)[0]
Run Code Online (Sandbox Code Playgroud)

这意味着:懒惰地匹配零个或多个字符,直到达到</a>字符串的一个或结尾.

注意,这*?是一个单一的运算符,(.*)?是不一样的.*?.

(并且不像往常那样使用单个正则表达式解析HTML.)


Ala*_*ore 7

我想这就是你要找的东西:

/(?:(?!%).)*/
Run Code Online (Sandbox Code Playgroud)

.匹配任何字符,但仅将负先行,(?!%),确认该字符不是%.请注意,当sentinel是单个字符时%,您可以使用否定字符类,例如:

/[^%]*/
Run Code Online (Sandbox Code Playgroud)

但对于像</a>你这样的多角色哨兵,你必须使用前瞻性方法:

/(?:(?!</a>).)*/i
Run Code Online (Sandbox Code Playgroud)

这实际上是在说"一次匹配零个或多个字符,但如果下一个字符结果是序列的开头,</a>或者</A>停止而不消耗它".