C ++ 11 RegEx有点问题,我认为这与贪婪有关。
这是一个小样本。
#include <stdio.h>
#include <string>
#include <regex>
int main (void)
{
std::string in="{ab}{cd}[ef]{gh}[ij][kl]"; // the input-string
std::regex rx1 ("(\\{.+?})(.*)", std::regex::extended); // non-greedy?
std::smatch match;
if (regex_match (in, match, rx1))
{
printf ("\n%s\n", match.str(1).c_str());
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望
{ab}
Run Code Online (Sandbox Code Playgroud)
用于输出。但是我得到了
{ab}{cd}[ef]{gh}
Run Code Online (Sandbox Code Playgroud)
我希望得到的结果是贪婪的,而不是?在。+之后。应该让它不贪心吧?
那么我的想法出了什么问题?感谢帮助!
克里斯
我想用sed删除一个模式,只是在第二次出现时.这是我想要的,删除一个模式,但第二次出现.
file.csv中有什么:
a,Name(null)abc.csv,c,d,Name(null)abc.csv,f
a,Name(null)acb.csv,c,d,Name(null)acb.csv,f
a,Name(null)cba.csv,c,d,Name(null)cba.csv,f
Run Code Online (Sandbox Code Playgroud)
需要输出:
a,Name(null)abc.csv,c,d,Name,f
a,Name(null)acb.csv,c,d,Name,f
a,Name(null)cba.csv,c,d,Name,f
Run Code Online (Sandbox Code Playgroud)
这是我试过的:
sed -r 's/(\(null)\).*csv//' file.csv
Run Code Online (Sandbox Code Playgroud)
这里的问题是正则表达式太贪婪,但我不能让它停止.我也试过这个,跳过第一次出现的"null":
sed -r '0,/null/! s/(\(null)\).*csv//' file.csv
Run Code Online (Sandbox Code Playgroud)
也试过,但贪婪的正则表达式仍然是问题.
sed -r 's/(\(null)\).*csv//2' file.csv
Run Code Online (Sandbox Code Playgroud)
我读过,?可以让正则表达式"懒惰",但我不能让它锻炼.
sed -r 's/(\(null)\).*?csv//' file.csv
Run Code Online (Sandbox Code Playgroud) 我有一个非贪婪的正则表达式的问题.我已经看到有关于非贪婪的正则表达式的问题,但他们没有回答我的问题.
问题:我试图匹配"lol"锚点的href.
注意:我知道这可以通过perl HTML解析模块完成,而我的问题不是在perl中解析HTML.我的问题是关于正则表达式本身,HTML只是一个例子.
测试用例:我有4个测试.*?和[^"].2首先产生预期的结果.然而,第3次没有,第4次只是,但我不明白为什么.
问题:
.*?和[^"]?非贪婪的操作员不应该工作吗?.*?和[^"]?我不明白为什么包括.*在前面改变正则表达式.(除了.*前面的第3和第4次测试是相同的).我可能不明白这些正则表达式是如何工作的.一个perl食谱食谱提到了一些东西,但我不认为它回答了我的问题.
use strict;
my $content=<<EOF;
<a href="/hoh/hoh/hoh/hoh/hoh" class="hoh">hoh</a>
<a href="/foo/foo/foo/foo/foo" class="foo">foo </a>
<a href="/bar/bar/bar/bar/bar" class="bar">bar</a>
<a href="/lol/lol/lol/lol/lol" class="lol">lol</a>
<a href="/koo/koo/koo/koo/koo" class="koo">koo</a>
EOF
print "| $1 | \n\nThat's ok\n" if $content =~ m~href="(.*?)"~s ;
print "\n---------------------------------------------------\n";
print "| $1 | \n\nThat's ok\n" if $content =~ m~href="(.*?)".*>lol~s ;
print …Run Code Online (Sandbox Code Playgroud) 用一个例子更好地解释.
这是文字:
<li>hello
THE WORDS
</li>
<li> cruel </li>
<li> world THE WORDS </li>
Run Code Online (Sandbox Code Playgroud)
我想找到以字符串开头<li>和结尾</li>并包含的字符串THE WORDS.我期待只与<li> hello THE WORDS </li>和匹配<li> world THE WORDS </li>.
我尝试了什么: (?s)<li>.*?(THE WORDS).*?</li>
有了这个,第二场比赛是<li> cruel </li> <li> world THE WORDS </li>.
我正在使用Sublime Text.
我认为这应该回归"州,国家",但它正在回归"国家"
System.out.println("city,state,country".replaceAll("(.*,)?", ""));
Run Code Online (Sandbox Code Playgroud)
为什么它以这种方式工作,如何让它返回"州,国家".我希望这个答案是一个正则表达式.
我有一个非常简单的正则表达式与此类似:
HOHO.*?_HO_
有了这个测试字符串...
fiwgu_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO___HO_fbguyev
_HOHO___HO_(最短匹配,非贪婪)_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO___HO_(最长的匹配,看起来很贪婪)。为什么?如何使它匹配最短的匹配项?
添加和删除的?结果相同。
编辑 -更好的测试字符串,显示为什么[^HOHO]不起作用:fiwgu_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO_H_O_H_O_HO_fbguye
我能想到的是,它可能多次匹配-但只有一个匹配_HO_,所以我不明白为什么它没有采用以结尾的最短匹配_HO_,而丢弃了其余匹配。
我已经浏览了所有标题为“非贪婪正则表达式贪婪”之类的问题,但它们似乎都存在其他问题。
我需要匹配@anything_here@一个字符串@anything_here@dhhhd@shdjhjs@.所以我使用了以下正则表达式.
^@.*?@
Run Code Online (Sandbox Code Playgroud)
要么
^@[^@]*@
Run Code Online (Sandbox Code Playgroud)
这两种方式都有效,但我想知道哪一个是更好的解决方案.具有非贪婪重复的正则表达式或带有否定字符类的正则表达式?
字符串:XXaaaXXbbbXXcccXXdddOO
我想匹配以 'XX' 开头并以 'OO' 结尾的最小字符串。
所以我写了非贪婪的reg:r'XX.*?OO'
>>> str = 'XXaaaXXbbbXXcccXXdddOO'
>>> re.findall(r'XX.*?OO', str)
['XXaaaXXbbbXXcccXXdddOO']
Run Code Online (Sandbox Code Playgroud)
我以为它会返回['XXdddOO']但它太“贪婪”了。
然后我知道我一定是弄错了,因为上面的限定符将首先匹配 'XX' 然后显示它是 'non-greedy'。
但我仍然想弄清楚如何直接得到我的结果['XXdddOO']。任何答复表示赞赏。
到目前为止,关键点实际上不是关于 non-greedy ,或者换句话说,它是关于我眼中的 non-greedy:它应该在左限定符(XX?和右限定符()之间匹配尽可能少的字符。 OO).当然事实是字符串是从左到右处理的。
我试图理解python中的非贪婪正则表达式,但我不明白为什么下面的例子会有这样的结果:
print(re.search('a??b','aaab').group())
ab
print(re.search('a*?b','aaab').group())
aaab
Run Code Online (Sandbox Code Playgroud)
我认为第一个是'b',第二个是'ab'。谁能解释一下?
这是我的文字:
1a.begin /path/1a.file
2bx.begin2 /path/my/2bx.file2
Run Code Online (Sandbox Code Playgroud)
预期输出是
begin /path/1a.file
begin2 /path/my/2bx.file2
Run Code Online (Sandbox Code Playgroud)
这里我想通过 sed 使用非贪婪匹配来做到这一点。(sed默认匹配是贪婪的,所有的1a.和2bx.都会被删除)
因此我尝试了命令:
echo -e "1a.begin /path/1a.file\n2bx.begin2 /path/my/2bx.file2"|sed 's/$.*[^\.]\.//g'
Run Code Online (Sandbox Code Playgroud)
我使用 来$.*匹配从行首开始的所有字符串。我曾经[^\.]防止贪婪匹配.一行中的所有内容(请参阅https://www.unix.com/shell-programming-and-scripting/133641-non-greedy-sed.html中的类似方法)但它没有改变文本。
那么我的脚本哪里错了?
non-greedy ×10
regex ×9
bash ×2
python ×2
regex-greedy ×2
sed ×2
c++ ×1
c++11 ×1
greedy ×1
java ×1
javascript ×1
perl ×1
string ×1
sublimetext ×1