您好我是正则表达式的新手,这可能是一个非常简单的问题(希望如此)。
我正在尝试使用一种解决方案来处理3种字符串
我在尝试什么(让字符串为str):
str.match(/(.*)(?!%*)/i)[1]
这听起来像是“匹配任何事物的实例,直到'%',如果找到它,或者只是匹配任何东西”
在萤火虫的头脑中,它似乎听起来更像是“只是匹配任何东西而完全无视负面前瞻”。也是为了让它变得懒惰 - (.*)?
- 似乎没有帮助。
让我们忘记一下,在这种特定情况下,我只匹配数字,所以/\d*/
会这样做。我试图理解一般规则,以便我可以随时应用它。
有人会非常友好地帮助我吗?
答案 0 :(得分:26)
更简单的
str.match(/[^%]*/i)[0]
这意味着,匹配零个或多个字符,这不是%
。
编辑:如果需要解析到</a>
,那么您可以解析pf字符序列,后跟</a>
,然后丢弃</a>
,这意味着您应该使用正面预测而不是否定。
str.match(/.*?(?=<\/a>|$)/i)[0]
这意味着:懒惰地匹配零个或多个字符,直到达到</a>
或字符串结尾。
请注意,*?
是单个运算符,(.*)?
与.*?
不同。
答案 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];