所以基本上我想重新格式化一个10位数字,如下所示:
1234567890 --> (123) 456-7890
要做到这一点,很长一段路要是让每个数字都是自己的捕获组,然后分别对每个数字进行反向引用:
'([0-9])([0-9])...([0-9])' --> (\1\2\3) \4\5\6-\7\8\9\10
这似乎是不必要和冗长的,但是当我尝试以下
时'([0-9]){10}'
似乎只有一个反向引用及其数字中的最后一位数字。
是否有更优雅的方式将每个角色引用为自己的捕获组?
谢谢!
答案 0 :(得分:2)
以下模式将完成这项工作:^(\d{3})(\d{3})(\d{4})$
^(\d{3})
:字符串的开头,然后正好是3位(\d{3})
:正好是3位数(\d{4})$
:正好是4位数字,然后是字符串的结尾。然后替换为:(\1) \2-\3
答案 1 :(得分:1)
虽然其示例正则表达式模式的另一个答案有望揭示捕获组的正确应用,但它并没有直接回答这个问题。如果您无法理解正则表达式的工作方式(特别是捕获组),您可能会发现自己希望将来使用不同的模式执行相同的操作。
是否有一种更优雅的方式来引用每个角色作为自己的角色 捕获组?
最初的答案是" No",无法使用传统的替换语法引用单个捕获组的单个捕获 - 无论是单个数字还是任何其他捕获组。考虑您使用{10}
指示精确匹配数,并且能够访问每个捕获似乎是完全合理的。但是,如果您使用+
或{,3}
指出了可变数量的匹配,该怎么办?没有明确定义的方式来了解发生了多少可能的捕获。如果相同的正则表达式模式在"重复"之后有更多的捕获组。捕获组,将无法正确引用后面的组。示例:给定模式([a-z])+(\d){3}
,第一个捕获组可以匹配4个字母,然后下一次匹配11个字母。如果你想引用捕获的数字,你会怎么做?您不能,因为\1
,\2
,\3
,...都将保留给第一组的可能捕获实例。
但是基本正则表达式语法无法执行您想要的操作并不能消除问题的有效性,也不一定将解决方案置于许多正则表达式实现的范围之外。各种正则表达式实现(即语言语法和正则表达式库)通过促进与各种对象的正则表达式匹配来访问重复捕获来解决此限制。 (c#和.Net正则表达式库就是一个例子,比如match.Groups[1].Captures[3]
)所以即使你不能使用基本的替换模式来获得你想要的东西,答案往往是"是",取决于具体实施。