标签: non-greedy

474
推荐指数
11
解决办法
22万
查看次数

我如何编写一个与非贪婪相匹配的正则表达式?

我需要有关非贪婪选项的正则表达式匹配的帮助.

匹配模式是:

<img\s.*>
Run Code Online (Sandbox Code Playgroud)

要匹配的文字是:

<html>
<img src="test">
abc
<img
  src="a" src='a' a=b>
</html>
Run Code Online (Sandbox Code Playgroud)

我在http://regexpal.com上测试

此表达式匹配从<img最后到的所有文本>.我需要它与>初始后遇到的第一个匹配<img,所以在这里我需要得到两个匹配而不是我得到的匹配.

我尝试了所有非贪婪的?组合,没有成功.

regex non-greedy regex-greedy

315
推荐指数
3
解决办法
31万
查看次数

C#Regex中的贪婪,非贪婪,全贪婪的匹配

如何在以下示例中获取所有匹配项:

// Only "abcd" is matched
MatchCollection greedyMatches = Regex.Matches("abcd", @"ab.*");

// Only "ab" is matched
MatchCollection lazyMatches   = Regex.Matches("abcd", @"ab.*?");

// How can I get all matches: "ab", "abc", "abcd"
Run Code Online (Sandbox Code Playgroud)

PS:我希望以通用方式获得所有比赛.上面的例子只是一个例子.

c# regex greedy non-greedy regex-greedy

21
推荐指数
2
解决办法
4万
查看次数

正则表达式非贪婪(懒惰)

我试图非贪婪地解析TD标签.我是从这样的事情开始的:

<TD>stuff<TD align="right">More stuff<TD align="right>Other stuff<TD>things<TD>more things
Run Code Online (Sandbox Code Playgroud)

我正在使用以下作为我的正则表达式:

Regex.Split(tempS, @"\<TD[.\s]*?\>");
Run Code Online (Sandbox Code Playgroud)

记录返回如下:

""
"stuff<TD align="right">More stuff<TD align="right>Other stuff"
"things"
"more things"
Run Code Online (Sandbox Code Playgroud)

为什么不拆分第一个完整的结果(以"stuff"开头的那个)?如何在有或没有参数的TD标签的所有实例上调整正则表达式以进行拆分?

c# regex html-table non-greedy

17
推荐指数
3
解决办法
2万
查看次数

有没有办法在JavaScript中使用ungreedy匹配正则表达式?

我想知道是否有一种方法可以在JavaScript中使用ungreedy匹配?我尝试了U modifer,但它似乎不起作用.

我想用JavaScript编写一个小的BBCode解析器,但是如果没有ungreedy匹配,就不可能(至少就我所知)做这样的事情:

'[b]one[/b] two [b]three[/b]'.replace( /\[b\](.*)\[\/b\]/, '<b>$1</b>' );
Run Code Online (Sandbox Code Playgroud)

但是这样的替换会很好,因为那时不需要检查HTML有效性.未封闭的标记将保留简单的文本.

javascript regex bbcode non-greedy

16
推荐指数
1
解决办法
5558
查看次数

Scala RegexParsers中的非贪婪匹配

假设我在Scala中编写了一个基本的SQL解析器.我有以下内容:

class Arith extends RegexParsers {
    def selectstatement: Parser[Any] = selectclause ~ fromclause
    def selectclause: Parser[Any] = "(?i)SELECT".r ~ tokens
    def fromclause: Parser[Any] = "(?i)FROM".r ~ tokens
    def tokens: Parser[Any] = rep(token) //how to make this non-greedy?
    def token: Parser[Any] = "(\\s*)\\w+(\\s*)".r
}
Run Code Online (Sandbox Code Playgroud)

在尝试匹配SELECT foo FROM barselect 语句时,如何防止selectclause因为rep(token)in 而吞噬整个短语~ tokens

换句话说,如何在Scala中指定非贪婪匹配?

为了澄清,我完全知道我可以在String模式本身中使用标准的非贪婪语法(*?)或(+?),但我想知道是否有一种方法可以在def标记内的更高级别指定它.例如,如果我已经定义了这样的标记:

def token: Parser[Any] = stringliteral | numericliteral | columnname
Run Code Online (Sandbox Code Playgroud)

那么如何为def标记内的rep(标记)指定非贪婪匹配?

regex scala parser-generator non-greedy

14
推荐指数
1
解决办法
3277
查看次数

正则表达式:懒惰更糟吗?

我总是写这样的正则表达式

<A HREF="([^"]*)" TARGET="_blank">([^<]*)</A>
Run Code Online (Sandbox Code Playgroud)

但我刚刚了解了这个懒惰的东西,我可以这样写

<A HREF="(.*?)" TARGET="_blank">(.*?)</A>
Run Code Online (Sandbox Code Playgroud)

使用第二种方法有什么不利之处吗?正则表达式肯定更紧凑(即使SO更好地解析它).

编辑:这里有两个最佳答案,指出表达式之间的两个重要差异.ysth的答案指向非贪婪/懒惰的弱点,其中超链接本身可能包含A标签的其他属性(绝对不好).Rob Kennedy在贪婪的例子中指出了一个弱点,因为锚文本不能包含其他标签(绝对不行,因为它也不会抓住所有的锚文本)......所以答案是,正则表达式就是他们的是,懒惰和非懒惰的解决方案似乎相同可能在语义上不等同.

编辑:第三个最佳答案是Alan M关于表达式的相对速度.暂时,我会将他标记为最佳答案,以便人们给他更多积分:)

regex non-greedy reluctant-quantifiers regex-greedy

12
推荐指数
3
解决办法
1315
查看次数

vim中的非贪婪多行搜索

我试图搜索ruby文件并找到所有方法(之后自动替换它们).在vim中,我使用以下正则表达式:

/\vdef.*(\n.*){-}end
Run Code Online (Sandbox Code Playgroud)

但即使我使用"{ - }",它也会选择整个文件的内容.

regex vim multiline non-greedy

12
推荐指数
3
解决办法
2845
查看次数

正则表达式表现得很懒,应该是贪心的

我认为默认情况下我的正则表达式会展示我想要的贪婪行为,但它不在以下代码中:

 Regex keywords = new Regex(@"in|int|into|internal|interface");
 var targets = keywords.ToString().Split('|');
 foreach (string t in targets)
    {
    Match match = keywords.Match(t);
    Console.WriteLine("Matched {0,-9} with {1}", t, match.Value);
    }
Run Code Online (Sandbox Code Playgroud)

输出:

Matched in        with in
Matched int       with in
Matched into      with in
Matched internal  with in
Matched interface with in
Run Code Online (Sandbox Code Playgroud)

现在我意识到,如果我只是按照长度降序对关键字进行排序,我可以让它为这个小例子工作

  • 我想知道为什么这不能按预期工作,并且
  • 我正在处理的实际项目在正则表达式中有更多的单词,并且按字母顺序保留它们非常重要.

所以我的问题是:为什么这是懒惰的,我该如何解决?

regex greedy non-greedy alternation regex-greedy

10
推荐指数
2
解决办法
999
查看次数

Java中的非贪婪正则表达式

我有下一个代码:

public static void createTokens(){
    String test = "test is a word word word word big small";
    Matcher mtch = Pattern.compile("test is a (\\s*.+?\\s*) word (\\s*.+?\\s*)").matcher(test);
    while (mtch.find()){
        for (int i = 1; i <= mtch.groupCount(); i++){
            System.out.println(mtch.group(i));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并有下一个输出:

word
w
Run Code Online (Sandbox Code Playgroud)

但在我看来,它一定是:

word
word
Run Code Online (Sandbox Code Playgroud)

有人请解释我为什么这样?

java regex non-greedy

10
推荐指数
1
解决办法
3万
查看次数