如何创建一个从字符串中获取分隔文本的正则表达式?例如,给定一个字符串
text ###token1### text text ###token2### text text
我想要一个可以退出的正则表达式###token1###
。是的,我也想要分隔符。通过添加另一个组,我可以同时获得:
(###(.+?)###)
如何创建一个从字符串中获取分隔文本的正则表达式?例如,给定一个字符串
text ###token1### text text ###token2### text text
我想要一个可以退出的正则表达式###token1###
。是的,我也想要分隔符。通过添加另一个组,我可以同时获得:
(###(.+?)###)
/###(.+?)###/
如果你想要###,那么你需要
/(###.+?###)/
? _ 表示非贪婪,如果你没有? ,那么它会抓住太多。
例如'###token1### text text ###token2###'
,都会被抓住。
我最初的答案是 * 而不是 +。* 表示 0 或更多。+ 表示 1 或更多。* 是错误的,因为这将允许 ###### 作为有效的查找对象。
用于玩正则表达式。我强烈推荐用于 Windows 的http://www.weitz.de/regex-coach/ 。你可以输入你想要的字符串和你的正则表达式,看看它实际上在做什么。
您选择的文本将存储在 \1 或 $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;
假设您也想匹配 ###token2### ......
/###.+###/
使用 () 和 \x。假设标记中的文本始终由 # 分隔的天真示例:
text (#+.+#+) text text (#+.+#+) text text
然后可以通过使用 \1 和 \2 来获取 () 中的内容(第一组为 \1,替换表达式中的第二个为 \2(假设您正在编辑器中进行搜索/替换)。对于例如,替换表达式可以是:
token1: \1, token2: \2
对于上面的例子,这应该产生:
token1: ###token1###, token2: ###token2###
如果您在程序中使用正则表达式库,您可能会调用一个函数来获取第一个和第二个标记的内容,您已经用它们周围的 ()s 表示。
好吧,当您使用诸如此类的分隔符时,基本上您只需抓住第一个分隔符,然后抓住与结束分隔符不匹配的任何内容,然后是结束分隔符。需要特别注意的是,在上面的示例中,[^#] 不能作为检查以确保不存在结束分隔符,因为单个 # 会导致正则表达式失败(即。“###foo#bar# ##). 在上面要解析的正则表达式的情况下,假设允许使用空标记(如果不允许,请将 * 更改为 +):
###([^#]|#[^#]|##[^#])*###