微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式:如何用对相同数字的函数调用替换由逗号分隔的数字

如何解决正则表达式:如何用对相同数字的函数调用替换由逗号分隔的数字

我试图用“描述性”函数替换函数调用中的数字,这些函数只返回给定的参数。基本上,在Java中模拟命名参数。例如,我想将参数替换为函数

func1(num1,num2,num3)

与:

func1(foo(num1),bar(num2),foobar(num3))

其中num1num2num3都是整数,foo(num1)返回num1bar(num2)返回num2和{ {1}} 返回 foobar(num3)

换句话说:所有参数都是整数。在我的代码中,有很多对 num3调用,我想对它们进行上述替换。

我想使用正则表达式来做到这一点,并且到目前为止已经尝试过(为了简单起见,我们将参数的数量固定为 3):

func1(num1,num3)

这不是正确的正则表达式(很可能是语法错误,但我不确定,因为我对正则表达式不太熟悉)。 我已经尝试了上述正则表达式的变体,但没有产生正确的结果。

如果有人知道如何为此实际编写正则表达式,将不胜感激!

编辑:我使用 Vim 作为我的编辑器。

解决方法

假设你总是试图匹配这个模式:

func1(123,456,789)(其中“123”等是任意数字)

并替换它:

func1(foo(123),bar(456),bazz(789))

我认为应该这样做(无论如何在 Vim 中):

:%s/(\(\d\+\),\(\d\+\),\(\d\+\))/(foo(\1),bar(\2),bazz(\3))/g

请注意,这需要统一使用括号、逗号、空格等。(更强大的解决方案会考虑有时逗号后没有空格,或打开括号后有不同数量的空格等)

说明-

:%s/(\(\d\+\),foobar(\3))/g
:%s/                              /                              /g   substitution delimeters; all lines; all occurences in a line
    (                                                                 opening paren of "func1()"
     \(    \)                                                         delimiters for first backreference
       \d                                                             Vim shorthand for "any digit" (instead of "[0-9]")
         \+                                                           Vim shorthand for "one or more instances of the preceding item"
                                                                      (Using the asterisk "*" matches zero or more,probably not what you want),Comma and space after the first backref capture group
               \(\d\+\),Second backref capture group and trailing comma
                         \(\d\+\))                                    Third backref,and the function closing paren
                                   (foo(\1),Your "foo" label,opening paren,first backref,closing paren,comma
                                             bar(\2),foobar(\3)      Second and third labels,parens,and backrefs
                                                                )     Closing paren for "func1()"

在 Vim 中,:help regex 将是一个很好的参考。使用 ctrl-](控制键和右方括号)遵循用户手册的内部链接。如果这能解决您的问题,请告诉我们。

,

已解决: 正如 MikeM 在评论中提到的,括号需要转义。所以正确的正则表达式如下所示:

:%s/func1(\([0-9]*\),\([0-9]*\),\([0-9]*\))/func1(foo(\1),foobar(\3))/

\([0-9]*\) 中,\(*\) 代表变量 \1,\2 等,具体取决于它的声明顺序。 [0-9]* 表示任意数字,其中每个数字可以在 [0-9] 之间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?