如何在带有正则表达式的定界标记之间循环?

时间:2020-03-05 18:57:02  来源:igfitidea点击:

如何创建一个正则表达式,可以从字符串中获取定界文本?例如,给定一个像

text ###token1### text text ###token2### text text

我想要一个能提取### token1 ###的正则表达式。是的,我也想要分隔符。通过添加另一个组,我可以同时获得:

(###(.+?)###)

解决方案

回答

/###(.+?)###/

如果我们想要###,那么我们需要

/(###.+?###)/

这 ?表示非贪婪,如果我们没有?,那么它将抓取太多。

例如''### token1 ## text text ### token2 ###'`都会被抓住。

我最初的答案是*,而不是+。 *表示0或者更大。 +表示1或者更大。 *是错误的,因为这样可以找到有效的东西#####。

用于使用正则表达式。对于Windows,我强烈建议http://www.weitz.de/regex-coach/。我们可以键入所需的字符串和正则表达式,然后查看其实际作用。

我们选择的文本将存储在\ 1或者$ 1中,具体取决于我们在哪里使用正则表达式。

回答

假设我们也想匹配### token2 ## ...

/###.+###/

回答

看看Regex Buddy Jeff已经多次推荐它了http://www.codinghorror.com/blog/archives/000027.html

回答

这也是一个很好的网站,我们可以浏览所有教程并熟悉Regex。

http://www.regular-expressions.info/

回答

使用()和\ x。假设令牌中的文本始终为#的幼稚示例:

text (#+.+#+) text text (#+.+#+) text text

然后,可以使用\ 1和\ 2(在替换表达式中,第一组为\ 1,第二组为\ 2)来抓取()中的内容(假设我们正在编辑器中进行搜索/替换)。例如,替换表达式可以是:

token1: , token2: 

对于上面的示例,应产生:

token1: ###token1###, token2: ###token2###

如果我们在程序中使用正则表达式库,则可能会调用一个函数来获取内容的第一个和第二个标记,这些标记用()括起来。

回答

好吧,当我们使用诸如此类的定界符时,基本上只需抓住第一个定界符,然后抓取任何与结束定界符不匹配的内容,然后再抓取结束定界符即可。特别要注意的是,在上述示例中,[^#]不能用作检查以确保结束定界符不存在,因为单数会导致正则表达式失败(即" ### foo#bar ## #)。在正则表达式上方进行解析的情况下,将假设允许空令牌(如果不允许,则将*更改为+)如下所示:

###([^#] |#[^#] | ## [^#])* ###

回答

在Perl中,我们实际上想要这样的东西:

$text = 'text ###token1### text text ###token2### text text';

while($text =~ m/###(.+?)###/g) {
  print , "\n";
}

它将在while循环内依次为我们提供每个令牌。 (。*?)确保我们在定界符之间获得最短的位,以防止其认为令牌为'token1 ## text text ### token2'。

或者,如果我们只想保存它们,则不要立即循环:

@tokens = $text =~ m/###(.+?)###/g;