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

时间:2011-12-21 03:20:38

标签: javascript regex negative-lookahead

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

我正在尝试使用一种解决方案来处理3种字符串

  • “45%”,预期结果:“45”
  • “45”,预期结果:“45”
  • “”,预期结果:“”

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

str.match(/(.*)(?!%*)/i)[1]

这听起来像是“匹配任何事物的实例,直到'%',如果找到它,或者只是匹配任何东西”

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

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

有人会非常友好地帮助我吗?

5 个答案:

答案 0 :(得分:26)

更简单的

str.match(/[^%]*/i)[0]

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


编辑:如果需要解析到</a>,那么您可以解析pf字符序列,后跟</a> ,然后丢弃</a>,这意味着您应该使用正面预测而不是否定。

str.match(/.*?(?=<\/a>|$)/i)[0]

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

请注意,*?是单个运算符,(.*)?.*?不同。

(和往常一样don't parse HTML with a single regex。)

答案 1 :(得分:6)

我认为这就是你要找的东西:

/(?:(?!%).)*/

.匹配任何字符,但只有在否定前瞻(?!%)之后,才会确认该字符不是%。请注意,当标记是%之类的单个字符时,您可以使用否定字符类,例如:

/[^%]*/

但是对于像</a>这样的多字符哨兵,你必须使用先行方法:

/(?:(?!</a>).)*/i

这实际上是在说“一次匹配零个或多个字符,但如果下一个字符变成序列</a></A>的开头,则停止而不消耗它”。

答案 2 :(得分:3)

使用完全搜索字符串的最简单方法是跳过正则表达式并使用indexOf,例如:

// String to be searched
var s = "Here is a <a>link</a>."

// String to find
var searchString = "</a>";

// Final match
var matched = "";

var c = s.indexOf(searchString);
if (c >= 0)
{
    // Returns the portion not including the search string;
    // in this example, "Here is a <a>link". If you want the
    // search string included, add the length of the search
    // string to c.
    matched = s.substring(c);
}

答案 3 :(得分:1)

我刚刚写完了你怎么说的话:

str.match(/(^[^%]*$)|^([^%]*)%.*/i)

这将匹配没有'%'的任何字符串或包含%的字符串的第一部分。 你必须得到第一组或第二组的结果。

编辑:这正是你想要的

str.match(/(?:^[^%]*$)|^(?:[^%]*)(?=%)/)
  • ?:删除所有分组
  • ?=是预测字符串是否包含%
  • 和[^%]匹配任何不是%
  • 的字符

所以正则表达式读取匹配任何不包含%的字符串,或者(否则匹配)第一个%

之前的所有字符

答案 4 :(得分:0)

匹配45%,45%,以及任何长度的任意数量使用此值(182%,18242等)

str.match(/([0-9]+)([%]?)/)[1];

如果你需要匹配空字符串也包含它为 ^ $ ,注意匹配(“...”)[1] 将为空字符串 >,所以你需要测试匹配,然后检查[0]或查看[1]是否未定义。

str.match(/([0-9]+)([%]?)|^$/)

如果您需要恰好匹配两位数字,请使用 {2,2} 锚定开头和结束字符之间的表达式:“ ^ (exp) $

str.match(/^([0-9]{2,2})([%]?)$/)[1];