标签: non-greedy

C ++ 11 RegEx,非贪婪

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)

我希望得到的结果是贪婪的,而不是?在。+之后。应该让它不贪心吧?

那么我的想法出了什么问题?感谢帮助!

克里斯

c++ regex non-greedy c++11

5
推荐指数
1
解决办法
2247
查看次数

Sed第二次更换

我想用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)

regex bash sed non-greedy

5
推荐指数
2
解决办法
4790
查看次数

perl非贪心的问题

我有一个非贪婪的正则表达式的问题.我已经看到有关于非贪婪的正则表达式的问题,但他们没有回答我的问题.

问题:我试图匹配"lol"锚点的href.

注意:我知道这可以通过perl HTML解析模块完成,而我的问题不是在perl中解析HTML.我的问题是关于正则表达式本身,HTML只是一个例子.

测试用例:我有4个测试.*?[^"].2首先产生预期的结果.然而,第3次没有,第4次只是,但我不明白为什么.

问题:

  1. 为什么没有第三测试中都试验失败.*?[^"]?非贪婪的操作员不应该工作吗?
  2. 为什么第四次测试适用于.*?[^"]?我不明白为什么包括.*在前面改变正则表达式.(除了.*前面的第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)

regex perl non-greedy regex-greedy

4
推荐指数
1
解决办法
1375
查看次数

正则表达式匹配多行字符串开始与x,以y结尾并包含z而不是中间的x

用一个例子更好地解释.

这是文字:

<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.

regex non-greedy sublimetext

4
推荐指数
1
解决办法
3447
查看次数

为什么这个非贪婪的正则表达式比我想要的更多?

我认为这应该回归"州,国家",但它正在回归"国家"

System.out.println("city,state,country".replaceAll("(.*,)?", ""));
Run Code Online (Sandbox Code Playgroud)

为什么它以这种方式工作,如何让它返回"州,国家".我希望这个答案是一个正则表达式.

java regex non-greedy

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

为什么这么简单。*?非贪婪的正则表达式是贪婪的吗?

我有一个非常简单的正则表达式与此类似:

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_,而丢弃了其余匹配。

我已经浏览了所有标题为“非贪婪正则表达式贪婪”之类的问题,但它们似乎都存在其他问题。

javascript regex non-greedy

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

哪个更好的非贪婪的正则表达式或否定的字符类?

我需要匹配@anything_here@一个字符串@anything_here@dhhhd@shdjhjs@.所以我使用了以下正则表达式.

^@.*?@
Run Code Online (Sandbox Code Playgroud)

要么

^@[^@]*@
Run Code Online (Sandbox Code Playgroud)

这两种方式都有效,但我想知道哪一个是更好的解决方案.具有非贪婪重复的正则表达式或带有否定字符类的正则表达式?

regex string non-greedy regex-negation

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

Python非贪婪的正则表达式并不完全符合我的预期

字符串: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 regex greedy non-greedy regex-greedy

2
推荐指数
1
解决办法
712
查看次数

Python Regex 中的非贪婪

我试图理解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'。谁能解释一下?

python regex non-greedy

2
推荐指数
1
解决办法
2475
查看次数

Bash sed 非贪婪匹配

这是我的文字:

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中的类似方法)但它没有改变文本。

那么我的脚本哪里错了?

bash sed non-greedy

2
推荐指数
1
解决办法
319
查看次数