有人能以一种可以理解的方式解释这两个术语吗?
我需要有关非贪婪选项的正则表达式匹配的帮助.
匹配模式是:
<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)
此表达式匹配从<img
最后到的所有文本>
.我需要它与>
初始后遇到的第一个匹配<img
,所以在这里我需要得到两个匹配而不是我得到的匹配.
我尝试了所有非贪婪的?
组合,没有成功.
如何在以下示例中获取所有匹配项:
// 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:我希望以通用方式获得所有比赛.上面的例子只是一个例子.
我试图非贪婪地解析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标签的所有实例上调整正则表达式以进行拆分?
我想知道是否有一种方法可以在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有效性.未封闭的标记将保留简单的文本.
假设我在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 bar
select 语句时,如何防止selectclause因为rep(token)
in 而吞噬整个短语~ tokens
?
换句话说,如何在Scala中指定非贪婪匹配?
为了澄清,我完全知道我可以在String模式本身中使用标准的非贪婪语法(*?)或(+?),但我想知道是否有一种方法可以在def标记内的更高级别指定它.例如,如果我已经定义了这样的标记:
def token: Parser[Any] = stringliteral | numericliteral | columnname
Run Code Online (Sandbox Code Playgroud)
那么如何为def标记内的rep(标记)指定非贪婪匹配?
我总是写这样的正则表达式
<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关于表达式的相对速度.暂时,我会将他标记为最佳答案,以便人们给他更多积分:)
我试图搜索ruby文件并找到所有方法(之后自动替换它们).在vim中,我使用以下正则表达式:
/\vdef.*(\n.*){-}end
Run Code Online (Sandbox Code Playgroud)
但即使我使用"{ - }",它也会选择整个文件的内容.
我认为默认情况下我的正则表达式会展示我想要的贪婪行为,但它不在以下代码中:
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)
现在我意识到,如果我只是按照长度降序对关键字进行排序,我可以让它为这个小例子工作
所以我的问题是:为什么这是懒惰的,我该如何解决?
我有下一个代码:
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)
有人请解释我为什么这样?
non-greedy ×10
regex ×10
regex-greedy ×5
c# ×2
greedy ×2
alternation ×1
bbcode ×1
html-table ×1
java ×1
javascript ×1
multiline ×1
scala ×1
vim ×1