标签: regex-greedy

使用非贪婪的限定词或前瞻是否更好?

我有一个可能很大的文本块来搜索实例[[...]],其中...可以是任何东西,包括其他括号(虽然它们不能嵌套; ]]后面的第一个实例[[结束匹配).

我可以想到两种方法来匹配这个文本:

  • 使用非贪婪的限定符: /\[\[.+?\]\]/
  • 使用前瞻: /\[\[(?:(?!\]\]).)+\]\]/

从性能的角度来看,一种选择本质上比另一种更好(我说第一种可能更具可读性)?我记得读过最好不要使用非贪婪的限定符,但我现在找不到它的来源.

regex performance regex-greedy

6
推荐指数
1
解决办法
1764
查看次数

Python re.sub使用非贪婪模式(.*?)和字符串结尾($)它变得贪婪!

码:

str = '<br><br />A<br />B'
print(re.sub(r'<br.*?>\w$', '', str))
Run Code Online (Sandbox Code Playgroud)

它应该返回<br><br />A,但它返回一个空字符串''!

有什么建议吗?

python regex regex-greedy

6
推荐指数
1
解决办法
4622
查看次数

正则表达式贪心问题(C#)

我有一个输入字符串,如"=== text ===和=== text ===",我想用相应的html标签替换wiki语法.

输入:

===text=== and ===text===
Run Code Online (Sandbox Code Playgroud)

理想输出:

<h1>text</h2> and <h1>text</h2>
Run Code Online (Sandbox Code Playgroud)

但是使用以下代码我得到了这个输出:

var regex = new Regex("---(.+)---");
var output = regex.Replace("===text=== and ===text===", "<h1>$1</h1>");

<h1>text=== and ===text</h1>
Run Code Online (Sandbox Code Playgroud)

我知道问题是我的正则表达式与贪婪相匹配.但是如何让他们不贪心.

谢谢你,亲切的问候.丹尼

c# regex greedy regex-greedy

6
推荐指数
1
解决办法
6935
查看次数

多行python正则表达式

我有一个像这样结构的文件:

A: some text
B: more text
even more text
on several lines
A: and we start again
B: more text
more
multiline text
Run Code Online (Sandbox Code Playgroud)

我试图找到将这样拆分我的文件的正则表达式:

>>>re.findall(regex,f.read())
[('some text','more text','even more text\non several lines'),
 ('and we start again','more text', 'more\nmultiline text')]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我最终得到了以下内容:

>>>re.findall('A:(.*?)\nB:(.*?)\n(.*?)',f.read(),re.DOTALL)
[(' some text', ' more text', ''), (' and we start again', ' more text', '')]
Run Code Online (Sandbox Code Playgroud)

多线文本没有被捕获.我想是因为懒惰的限定符真的很懒,什么都没有,但我把它拿出来,正则表达式变得非常贪婪:

>>>re.findall('A:(.*?)\nB:(.*?)\n(.*)',f.read(),re.DOTALL)
[(' some text',
' more text',
'even more text\non several lines\nA: and we start again\nB: more text\nmore\nmultiline text')]
Run Code Online (Sandbox Code Playgroud)

有人有想法吗?谢谢 !

python regex multiline regex-greedy

6
推荐指数
1
解决办法
2287
查看次数

使一个或零正则表达式运算符贪婪

我有两个句子作为输入.比方说,举个例子:

<span>I love my red car.</span>
<span>I love my car.</span>
Run Code Online (Sandbox Code Playgroud)

现在我想匹配span-tags内的每个textpart(如果有颜色).

如果我使用以下正则表达式:

/<span>(.*?)(?P<color>red)(.*?)<\/span>/ms
Run Code Online (Sandbox Code Playgroud)

仅匹配具有颜色的线.所以我想让我们使用?-operator(一个或零).

/<span>(.*?)(?P<color>red)?(.*?)<\/span>/ms
Run Code Online (Sandbox Code Playgroud)

现在两个行/句子都将匹配.可悲的是,颜色不再匹配了.

问题是为什么?通过使用 ".*?" 在颜色部分之前,我以为我已经使正则表达式非贪婪,所以颜色部分会匹配,如果它存在的话.但正如所说,它不......

php regex greedy non-greedy regex-greedy

6
推荐指数
1
解决办法
756
查看次数

精确贪婪/不情愿X {n}之间的区别?

在Java Pattern类的文档中,我看到确切的量词X{n}有贪婪和不情愿的形式:

贪婪的量词

  • X {n} X,正好是n次
  • ...

不情愿的量词

  • X {N}?X,正好是n次
  • ...

文档给出了贪婪和不情愿行为之间差异的一般示例,但没有给出确切量词的任何示例.

起初我想,"好吧,也许差异在于它X本身可以以不同的方式匹配." 但是其中X可以有自己的贪婪/不情愿的说明者,而且我确实测试了它,这不是一个区别(贪婪不情愿).

鉴于此,在任何一种情况下,它都会完全匹配n,两者的行为之间是否有任何区别?

regex reluctant-quantifiers regex-greedy

6
推荐指数
1
解决办法
94
查看次数

为什么空格会导致sed中记忆的模式输出不同的东西

我试图通过终端获取此xml行中值条目的值,所以我使用sed.

abcs='<param name="abc" value="bob3" no_but_why="4"/>'

echo $abcs | sed -e 's/.*value="\(.*\)" .*/\1/'
echo $abcs | sed -e 's/.*value="\(.*\)".*/\1/'
Run Code Online (Sandbox Code Playgroud)

输出是:

bob3
bob3" no_but_why="4
Run Code Online (Sandbox Code Playgroud)

为什么没有空间的第二种方式导致的不仅仅是我想要打印出来的?为什么\ 1会受到影响

regex bash shell sed regex-greedy

6
推荐指数
1
解决办法
40
查看次数

在 SSMS 2016 中使用正则表达式替换来修剪线条

如何使用 SSMS 2016 正则表达式替换功能删除行尾的额外空格和制表符?

编辑器内容示例:

select
    'tab'   
,   'space' 

select
    'tabs'      
,   'spaces'  
Run Code Online (Sandbox Code Playgroud)

目标:

select
    'tab'
,   'space'

select
    'tabs'
,   'spaces'
Run Code Online (Sandbox Code Playgroud)

在 SSMS 2012 中查找字符串:b*$匹配那些额外的制表符和空格,并允许我用空替换它们。SSMS 2016 开始为查找/替换功能使用某种 .net 正则表达式语法。使用\s+$几乎在 2016 年有效,但它删除了空行。

regex ssms regex-greedy ssms-2016

6
推荐指数
1
解决办法
1236
查看次数

Mod重写正则表达式负前瞻

我正在尝试匹配所有以 开头的 URI,#/tool_[a-z\-]+# 除非后跟/public. 比如/tool_calculator什么的。

例如,如果 URI 以/tool_store-front或开头,/tool_store-front/anything-but-public那么我想将它们重定向到 HTTPS。因此,/tool_store-front/public不会重定向。

这是我所拥有的,但它不起作用

RewriteCond %{HTTPS} =off
RewriteCond %{REQUEST_URI} ^/?tool_[a-z-]+(?!/public.+) [OR]
RewriteCond %{REQUEST_URI} ^/?secure
RewriteCond %{REQUEST_URI} !^/?secure/public/info
RewriteRule ^(.*)$ https://www.example.org%{REQUEST_URI} [NC,L]
Run Code Online (Sandbox Code Playgroud)

regex .htaccess mod-rewrite negative-lookahead regex-greedy

6
推荐指数
1
解决办法
2026
查看次数

如何在Java中使用正则表达式查找字符串中最后一组字符?

我需要找到字符串中字符集的最后一个索引。考虑字符集为x,y,z和string作为Vereador Luiz Pauly Home,那么我需要index为18

因此,寻找索引我已经创建了一个模式DOTALL标志和贪婪量词*(S?)。(X | Y | Z) 。当模式应用于该字符串(多行)时,我可以从起始组中找到索引。代码:

int findIndex(String str){
  int index = -1;
  Pattern p = Pattern.compile("(?s).*(x|y|z)");
  Matcher m = regex.matcher(str);
  if(m.find()){
    index = m.start(1);
  }
  return index;
}
Run Code Online (Sandbox Code Playgroud)

如预期的那样,如果匹配,它将正确返回值。

但是,如果没有匹配项,则它花费的时间太长(600000个字符需要17分钟),因为它是贪婪的匹配项。

我尝试了其他量词,但无法获得所需的输出。那么,谁能推荐更好的正则表达式呢?

PS:我也可以考虑从最后遍历内容并找到索引。但是我希望正则表达式中有更好的方法可以快速完成工作。

java regex regex-greedy

6
推荐指数
1
解决办法
247
查看次数