Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式:匹配任何内容直到某个内容(如果存在)_Javascript_Regex_Regex Lookarounds - Fatal编程技术网

Javascript正则表达式:匹配任何内容直到某个内容(如果存在)

Javascript正则表达式:匹配任何内容直到某个内容(如果存在),javascript,regex,regex-lookarounds,Javascript,Regex,Regex Lookarounds,我是正则表达式新手,这可能是一个非常简单的问题(希望如此) 我试图用一个解决方案来解决3种字符串 “45%”,预期结果:“45” “45”,预期结果:“45” “”中,预期结果为“” 我正在尝试的内容(让字符串为str): 这在我脑海中听起来像是“匹配任何对象的任何实例,直到找到“%”,否则就匹配任何对象” 在firebug的头脑中,这听起来更像是“只匹配任何东西,完全忽略负面展望”。另外,让它变得懒惰-(.*)-似乎没有帮助 让我们暂时忘记,在这种特定情况下,我只匹配数字,所以/\d*/就

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

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

  • “45%”,预期结果:“45”
  • “45”,预期结果:“45”
  • “”中,预期结果为“”
我正在尝试的内容(让字符串为str):

这在我脑海中听起来像是“匹配任何对象的任何实例,直到找到“%”,否则就匹配任何对象”

在firebug的头脑中,这听起来更像是“只匹配任何东西,完全忽略负面展望”。另外,让它变得懒惰-
(.*)
-似乎没有帮助

让我们暂时忘记,在这种特定情况下,我只匹配数字,所以
/\d*/
就可以了。我试图理解一条一般规则,以便在任何时候都能应用它

有人愿意帮我吗?

简单一点的怎么样

str.match(/[^%]*/i)[0]
这意味着,匹配零个或多个字符,而不是
%


编辑:如果需要解析到
,那么您可以解析一个字符序列,后跟
,然后丢弃
,这意味着您应该使用正向前瞻而不是负向前瞻

str.match(/.*?(?=<\/a>|$)/i)[0]
str.match(/.*(?=|$)/i)[0]
这意味着:延迟匹配零个或多个字符,直到到达
或字符串末尾

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


(和往常一样。)

我只是照你说的写了出来:

str.match(/(^[^%]*$)|^([^%]*)%.*/i)
这将匹配任何不带“%”的字符串或包含%的字符串的第一部分。 您必须从第一组或第二组获得结果

编辑:这正是您在下面想要的

str.match(/(?:^[^%]*$)|^(?:[^%]*)(?=%)/)
  • ?:删除所有分组
  • ?=是一个前瞻,用于查看字符串是否包含%
  • 和[^%]匹配任何非%

因此,正则表达式读取匹配任何不包含%的字符串,或(以其他方式匹配)第一个%

之前的所有字符。使用精确搜索字符串的最简单方法是跳过正则表达式,只使用
索引,例如:

// 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);
}
//要搜索的字符串
var s=“这里有一个链接。”
//要查找的字符串
var searchString=“”;
//决赛
var匹配=”;
var c=s.indexOf(搜索字符串);
如果(c>=0)
{
//返回不包括搜索字符串的部分;
//在本例中,“这是一个链接”。如果您希望
//包含搜索字符串,请添加搜索长度
//字符串到c。
匹配=s.子串(c);
}

要匹配45%、45%和任意长度的任何数字,请使用此选项(182%、18242等)

如果需要匹配空字符串并将其包含为^$,请注意,空字符串的匹配(“…”[1]将未定义,因此需要测试匹配,然后检查[0]或查看[1]是否未定义

str.match(/([0-9]+)([%]?)|^$/)
如果需要精确匹配两个数字,请使用{2,2}在开始和结束行字符之间锚定表达式:“^(exp)$


我想这就是你想要的:

/(?:(?!%).)*/
匹配任何字符,但仅在负前瞻之后,
(?!%)
确认字符不是
%
。请注意,当sentinel是单个字符(如
%
)时,您可以使用否定字符类,例如:

/[^%]*/
但是对于像
这样的多字符哨兵,您必须使用前瞻方法:

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

这实际上是说“一次匹配零个或多个字符,但如果下一个字符是序列的开头,请不要使用它”。

在正则表达式中,尤其是JavaScript风格中,
^
字符表示从引用字符串的开头开始匹配@austincheney:当
^
用作文本锚定时,这是正确的,但是
^
在字符类中使用时具有不同的含义,即它否定匹配(“除了这些字符以外的任何字符…”)。谢谢Kenny,这很有效。但是,如果“%”是“”,该怎么办?我想排除一个模式多于一个字符。更清楚地说,“(或任何模式)可能存在,也可能不存在。谢谢你,肯尼,这正是我希望找到的。见我对艾伦的评论。我真的很感激你花时间一点一点地解释。。。圣诞快乐!负前瞻:
(?!%*)
说:“断言零个或多个百分号不在后面”这个断言永远不可能是真的,因为
%*
总是真的!(
%*
根本不匹配任何东西-这在任何地方都是正确的-即使是空字符串。)谢谢bobby,但我正在寻找正则表达式解决方案。你所描述的是我通常会做的,但在这样做的时候,我会重复我的这一小段词汇……这太棒了。正是我想要的。多亏了你和肯尼,现在我知道了如何一步一个脚印来确保我的最后一步不会落在某个特定的模式上。*/
,以及如何走很长的路,直到下一个字符是我的模式的开始,或者字符串的结束。
/.*(?=pattern |$)/
。我认为肯尼的更像是我所期待的,而你的则不那么明显,绝对是辉煌的。我不认为我会想到它。非常感谢。
/(?:(?!%).)*/
/[^%]*/
/(?:(?!</a>).)*/i