Regex 捕获/反向引用数字的每个数字的一种简单方法

Regex 捕获/反向引用数字的每个数字的一种简单方法,regex,Regex,基本上我想重新格式化一个10位数的数字,如下所示: 1234567890 --> (123) 456-7890 要做到这一点还有很长的路要走,就是让每个号码都成为自己的捕获组,然后分别反向引用每个号码: '([0-9])([0-9])...([0-9])' --> (\1\2\3) \4\5\6-\7\8\9\10 这似乎不必要且冗长,但当我尝试以下内容时 '([0-9]){10}' 似乎只有一个反向引用及其在数字中的最后一个数字 是否有更优雅的方式将每个角色作为自己的捕获组引

基本上我想重新格式化一个10位数的数字,如下所示:

1234567890 --> (123) 456-7890
要做到这一点还有很长的路要走,就是让每个号码都成为自己的捕获组,然后分别反向引用每个号码:

'([0-9])([0-9])...([0-9])' --> (\1\2\3) \4\5\6-\7\8\9\10
这似乎不必要且冗长,但当我尝试以下内容时

'([0-9]){10}'
似乎只有一个反向引用及其在数字中的最后一个数字

是否有更优雅的方式将每个角色作为自己的捕获组引用


谢谢

以下模式将完成此任务:
^(\d{3})(\d{3})(\d{4})$

  • ^(\d{3})
    :字符串的开头,然后正好是3位数字
  • (\d{3})
    :正好是3位数字
  • (\d{4})$
    :正好是4位数字,然后是字符串的结尾

然后替换为:
(\1)\2-\3

以下模式将完成此任务:
^(\d{3})(\d{3})(\d{4})$

  • ^(\d{3})
    :字符串的开头,然后正好是3位数字
  • (\d{3})
    :正好是3位数字
  • (\d{4})$
    :正好是4位数字,然后是字符串的结尾

然后替换为:
(\1)\2-\3

尽管另一个答案及其示例正则表达式模式希望能够阐明捕获组的正确应用,但它并没有直接回答这个问题。如果您无法理解正则表达式是如何工作的(尤其是捕获组),您可能会发现自己希望将来用不同的模式做同样的事情

是否有更优雅的方式将每个字符作为自己的字符引用 捕获组

最初的答案是“否”,无法使用传统替换语法引用单个捕获组的单个捕获-无论它是单个数字还是任何其他捕获组。考虑到您用“代码> { 10 } /CODE >指示精确的匹配数,并且能够访问每个捕获似乎是完全合理的。但是,如果您使用
+
{,3}
指示了可变数量的匹配项,该怎么办?没有明确的方法可以知道发生了多少次可能的捕获。如果相同的正则表达式模式在“重复”捕获组之后有更多的捕获组,则无法正确引用后面的组。示例:给定模式
([a-z])+(\d){3}
,第一个捕获组可以一次匹配4个字母,然后下一次匹配11个字母。如果你想引用捕获的数字,你会怎么做?您不能,因为
\1
\2
\3
。。。将全部保留给第一个组的可能捕获实例


但是,基本正则表达式语法无法实现您想要的功能,这并不会消除问题的有效性,也不一定会将解决方案置于许多正则表达式实现之外。各种正则表达式实现(即语言语法和正则表达式库)通过促进正则表达式与各种对象的匹配以访问重复捕获来解决此限制。(c#和.Net正则表达式库就是一个例子,比如
match.Groups[1].Captures[3]
)因此,即使您不能使用基本替换模式来获得所需,答案通常是“是”,取决于具体的实现。

尽管另一个答案及其示例正则表达式模式希望能够阐明捕获组的正确应用,但它并没有直接回答这个问题。如果您无法理解正则表达式是如何工作的(尤其是捕获组),您可能会发现自己希望将来用不同的模式做同样的事情

是否有更优雅的方式将每个字符作为自己的字符引用 捕获组

最初的答案是“否”,无法使用传统替换语法引用单个捕获组的单个捕获-无论它是单个数字还是任何其他捕获组。考虑到您用“代码> { 10 } /CODE >指示精确的匹配数,并且能够访问每个捕获似乎是完全合理的。但是,如果您使用
+
{,3}
指示了可变数量的匹配项,该怎么办?没有明确的方法可以知道发生了多少次可能的捕获。如果相同的正则表达式模式在“重复”捕获组之后有更多的捕获组,则无法正确引用后面的组。示例:给定模式
([a-z])+(\d){3}
,第一个捕获组可以一次匹配4个字母,然后下一次匹配11个字母。如果你想引用捕获的数字,你会怎么做?您不能,因为
\1
\2
\3
。。。将全部保留给第一个组的可能捕获实例


但是,基本正则表达式语法无法实现您想要的功能,这并不会消除问题的有效性,也不一定会将解决方案置于许多正则表达式实现之外。各种正则表达式实现(即语言语法和正则表达式库)通过促进正则表达式与各种对象的匹配以访问重复捕获来解决此限制。(c#和.Net正则表达式库就是一个例子,比如
match.Groups[1].Captures[3]
)因此,即使您不能使用基本的替换模式来获得所需的,根据具体的实现,答案通常是“是”。

这并不是您问的第一个基本正则表达式问题。花点时间阅读regex教程。培训是关键。看看这个:@erza嗯,是的,这是不可能的。这种行为需要使用您在regex实现中使用的编程语言创建。我建议你阅读这个问题的公认答案:。看,这不是你问的第一个基本正则表达式问题