如何解决正则表达式:如何用对相同数字的函数调用替换由逗号分隔的数字
我试图用“描述性”函数替换函数调用中的数字,这些函数只返回给定的参数。基本上,在Java中模拟命名参数。例如,我想将参数替换为函数:
func1(num1,num2,num3)
与:
func1(foo(num1),bar(num2),foobar(num3))
其中num1
、num2
、num3
都是整数,foo(num1)
返回num1
,bar(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 举报,一经查实,本站将立刻删除。