1

如何创建一个从字符串中获取分隔文本的正则表达式?例如,给定一个字符串

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

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

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

5 回答 5

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

如果你想要###,那么你需要

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

_ 表示非贪婪,如果你没有? ,那么它会抓住太多。

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

我最初的答案是 * 而不是 +。* 表示 0 或更多。+ 表示 1 或更多。* 是错误的,因为这将允许 ###### 作为有效的查找对象。

用于玩正则表达式。我强烈推荐用于 Windows 的http://www.weitz.de/regex-coach/ 。你可以输入你想要的字符串和你的正则表达式,看看它实际上在做什么。

您选择的文本将存储在 \1 或 $1 中,具体取决于您使用正则表达式的位置。

于 2008-09-16T20:13:33.740 回答
1

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

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

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

这将在 while 循环中依次为您提供每个令牌。(.*?) 确保您获得分隔符之间的最短位,防止它认为令牌是 'token1### text text ###token2'。

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

@tokens = $text =~ m/###(.+?)###/g;
于 2008-09-16T20:21:02.660 回答
0

假设您也想匹配 ###token2### ......

/###.+###/
于 2008-09-16T20:14:55.873 回答
0

使用 () 和 \x。假设标记中的文本始终由 # 分隔的天真示例:

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

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

token1: \1, token2: \2

对于上面的例子,这应该产生:

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

如果您在程序中使用正则表达式库,您可能会调用一个函数来获取第一个和第二个标记的内容,您已经用它们周围的 ()s 表示。

于 2008-09-16T20:19:07.830 回答
0

好吧,当您使用诸如此类的分隔符时,基本上您只需抓住第一个分隔符,然后抓住与结束分隔符不匹配的任何内容,然后是结束分隔符。需要特别注意的是,在上面的示例中,[^#] 不能作为检查以确保不存在结束分隔符,因为单个 # 会导致正则表达式失败(即。“###foo#bar# ##). 在上面要解析的正则表达式的情况下,假设允许使用空标记(如果不允许,请将 * 更改为 +):

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

于 2008-09-16T20:20:10.650 回答