【问题标题】:Combine regex patterns to match groups inside delimited strings组合正则表达式模式以匹配分隔字符串内的组
【发布时间】:2016-09-28 06:19:26
【问题描述】:

背景

希望仅在由美元符号分隔的文本中(从不跨越行)用美元符号替换句点。例如:

Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$.

问题

following regex 几乎可以工作,但是太简单了:

/([[:alnum:]])\.([[:alnum:]])/g

如果在分隔符 ($) 之外存在匹配项,则会替换太多。

以下正则表达式:

/\$.*?\$/g

Matches and groups 分隔字符串:

姓名:$annie.bettie.cindy.dannie.ellie$。只有 $a$ 个名字。 $a.b.c.d.e.f$.

问题

如何组合这两个正则表达式,以便用另一个字符串替换句点?例如:

Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$.

最终会变成:

Names: `r v$annie$bettie$cindy$dannie$ellie`. Only `r v$a` names. `r v$a$b$c$d$e$f`.

我遇到的问题是匹配分隔点。

正则表达式将从运行 bash 的终端通过管道传输到 sed。

【问题讨论】:

  • 也许this SO thread 可以带来一些启发。
  • 你能解释一下你的预期输出吗?问题陈述说你需要在$sometext$ 模式中用$ 替换.。特别是我没有得到r v 部分以及模式末尾缺少的$
  • @Sundeep:目标是创建一个正则表达式,将简单的Pandoc YAML 变量引用转换为更强大的内联knitr 表达式。

标签: regex sed substring grouping


【解决方案1】:

这可能对你有用(GNU sed):

sed -r ':a;s/^(([^$]*\$[^$.]*\$)*[^$]*\$[^$.]*)\./\1\n/;ta;s/(\$[^$]*)\$/`r v\1`/g;y/\n/$/' file

用换行符替换组内的所有句点。插入组前缀和后缀文字,然后将换行符转换为美元。

【讨论】:

    【解决方案2】:
    $ cat ip.txt 
    Names: $annie.bettie.cindy.dannie.ellie$. Only $a$ names. $a.b.c.d.e.f$.
    
    $ perl -pe '
    BEGIN
    {
        sub f
        {
            $a = $_[0] =~ tr/./$/r;
            $a =~ s/^/`r v/;
            $a =~ s/.$/`/;
            return $a;
        }
    }
    s/\$.*?\$/f($&)/ge
    ' ip.txt
    Names: `r v$annie$bettie$cindy$dannie$ellie`. Only `r v$a` names. `r v$a$b$c$d$e$f`.
    
    • 子程序f$sometext$ 字符串执行必要的转换——首先将. 音译为$,然后在开头添加一些字符串,最后删除最后一个字符以替换为所需格式
      • 子程序放在BEGIN块中,在逐行处理输入文件之前执行
    • s/\$.*?\$/f($&)/ge 将提取 $sometext$ 模式并传递给 f 子例程。 Perl 知道用e 标志来称呼它
    • -p switch 表示输入行在所有命令后打印

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多