为什么这个表达式不遵循贪婪的方法?
string input = @"cool man! your dog can walk on water ";
string pattern = @"cool (?<cool>(.*)) (?<h>((dog)*)) (?(h)(?<dog>(.*))) ";
MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.IgnorePatternWhitespace);
foreach (Match match in matches)
{
Console.WriteLine("cool=" + match.Groups["cool"].Value);
Console.WriteLine("dog=" + match.Groups["dog"].Value);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
输出:
酷=男人!你的狗可以在水上行走 狗=
你可以观察到:(狗)组匹配0次.但是,因为,*是贪婪的,为什么不尝试找到(狗)的最大匹配为1?
有线索吗?
我正在尝试匹配HTML源代码中的特定span-tags.
lang-attribute和标记的内部HTML用作返回新字符串的函数的参数.
我想用被调用函数的结果替换旧标签,属性和内容.
主题是这样的:
<p>Some codesnippet:</p>
<span lang="fsharp">// PE001
let p001 = [0..999]
|> List.filter (fun n -> n % 3 = 0 || n % 5 = 0)
|> List.sum
</span>
<p>Another code snippet:</p>
<span lang="C#">//C# testclass
class MyClass {
}
</span>
Run Code Online (Sandbox Code Playgroud)
为了提取lang属性和内容的值,我使用以下表达式对这些值进行分组:
/(<span lang="(.*)">(.*)</span>)/is
Run Code Online (Sandbox Code Playgroud)
由于正则表达式趋于贪婪,因此该表达式与完整主题匹配,而不仅仅是一个span-tag及其内容.
我如何设法匹配一个span-tag?
脚本:
$aString = "This is Just a temp string just for fun";
print '^^^^^^^^' . "\n";
if( $aString =~ /^This\sis.*just/ )
{
print $aString . " ->true<-\n" . "^^^^^^^^" ."$1";
}
else
{
print $aString . " ->false<-\n" . "^^^^^^^^" ."$1"
}
Run Code Online (Sandbox Code Playgroud)
输出:
^^^^^^^^
这只是一个临时字符串只是为了好玩 - > true < -
^^^^^^^^
问题:
aString匹配的子表达式有多少?请澄清一下.
我不明白这种行为.我有这样的例子,需要抓住html评论.
var str = '.. <!--My -- comment test--> ';
var regex1 = /<!--[.]*-->/g;
var regex2 = /<!--.*-->/g;
alert(str.match(regex1)); // null
alert(str.match(regex2)); // <!--My -- comment test-->
Run Code Online (Sandbox Code Playgroud)
第二个正则表达式regex2正常,输出正是所需的.第一个节目null.我不明白其中的区别.RegExpressions <!--[.]*-->和<!--.*-->意思相同 - " <!--除了换行符之外的任何字符,从0开始到尽可能多,并以-->" 完成".但对于第二个它是有效的,而第一个没有.为什么?
UPD.我已阅读评论并有更新.
var str3 = '.. <!--Mycommenttest--> ';
var str4 = '.. <!--My comment test--> ';
var regex3 = /<!--[\w]*-->/g;
var regex4 = /<!--[\s\S]*-->/g;
alert(str.match(regex3)); // <!--Mycommentstest-->
alert(str.match(regex4)); // <!-- My comment test -->
Run Code Online (Sandbox Code Playgroud)
所以可以使用有限的匹配变量来匹配任何东西.那么应该采用哪种方式正确使用RegExps?有[]没有?无法得到差异,两者都给出正确的输出.
这是我的意见:
xxx999xxx888xxx777xxx666yyy
xxx222xxx333xxx444xxx555yyy
这是表达式:
xxx.*xxx(?<matchString>(.(?!xxx.*xxx))*?)xxx.*yyy
Run Code Online (Sandbox Code Playgroud)
它返回444.
我希望它能同时返回444和777,但我不能随便找到它.
我有!排除,以便它只匹配左侧的最里面(当我只搜索一个结果时,这很有效,大部分时间都是这样).但是,我感觉这与它在此实例中跳过第一个结果的原因有关.我不知道从哪里开始.
我一直在这里测试: http: //regexlib.com/RETester.aspx(启用"SingleLine"和"Explicit Capture")
任何意见,将不胜感激!
所以我想使用下面的正则表达式搜索字符串:
border-.*\.5pt
Run Code Online (Sandbox Code Playgroud)
找到所有border-top,border-bottom在与的边框厚度文件等CSS属性.5pt.它通常效果很好,但它太贪心了.
例如,以下所有内容都以单个匹配的形式返回:
border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt
Run Code Online (Sandbox Code Playgroud)
我希望这两个CSS属性是两个单独的匹配.
所以我试着将我的正则表达式修改为:
border-.*?\.5pt
Run Code Online (Sandbox Code Playgroud)
用?它来使它不贪婪.但是,在修改之后,没有任何匹配.
谁能解释为什么我看到这种行为?我错过了什么?
(如果值得了解的话,我在进行此搜索时使用的是Microsoft Expression Web的"使用正则表达式查找".)
正则表达式:
<span style='.+?'>TheTextToFind</span>
Run Code Online (Sandbox Code Playgroud)
HTML:
<span style='font-size:11.0pt;'>DON'T_WANT_THIS_MATCHED <span style='font-size:18.0pt;'>TheTextToFind</span></span>
Run Code Online (Sandbox Code Playgroud)
为什么比赛包括这个?
<span style='font-size:11.0pt;'>DON'T_WANT_THIS_MATCHED
Run Code Online (Sandbox Code Playgroud)
我明白?这里的标记意味着"懒惰".
我的问题基本上是[0-9]{2}?vs[0-9]{2}
它们一样吗?
如果是这样,我们为什么要编写前面的表达式?是不是懒惰模式更加昂贵的表现明智?
如果没有,你能分辨出来吗?
随着*和+贪婪在下面的正则表达式模式中表现不同,为什么?
这是我的文字:
hello abcdef ghijklmc happiness<span>Lorem impsum</span> lorem
<p>Lorem impsum</p>Lorem impsum Today is Feb 23rd, 2003
这是regexp:
<[/]?[a-z].*?>
结果:

有这种模式:
<[/]?[a-z].+?>
结果:

我在文件中有一些数据,并且我正在使用这些数据Regex来获取单个元素并删除和标记\r\n之间的所有内容。<opening></closing>
但是,当我尝试elements单独选择时,最后,整个数据将被选为一组。
这是我的正则表达式:
(<([ph0-9figc]+)>)([a-zA-Z0-9äöüÄÖÜß[:punct:] \n\r\t])+(<\/\2>)
Run Code Online (Sandbox Code Playgroud)
输入数据样本
regex ×10
regex-greedy ×10
c# ×3
non-greedy ×3
html ×2
javascript ×2
.net ×1
greedy ×1
perl ×1
php ×1
quantifiers ×1
regex-group ×1
vbscript ×1