正则表达式用字符串替换格式模板,以便结果是格式化的字符串

时间:2013-03-04 23:21:30

标签: php c++ regex templates string-formatting

基本上我有以下内容:

  • 输入字符串(例如ABCDEFGHI)
  • 输入模板(例如XXX-XXX-XXX)

我希望看到的输出是ABC-DEF-GHI

我想它会像"XXX-XXX-XXX".replace("regex", "ABCDEFGHI");

问题在于模板是动态的。它可以是XXX-XXX-XXXXX-XXXX-XXX或任何其他可以包含任何特殊字符的组合,但匹配的字符始终为X

模板的长度或特殊字符分隔的组数不受限制。 只要有与输入字符数相同的X,XX-X-XXXX-XXX-XXX-XXX-X都是有效的模板。

到目前为止,我有这个:"/^([^a-zA-Z0-9]*X){9}[a-zA-Z0-9]*$/",它将验证我的模板。

有人可以对此有所了解吗?有没有办法用模板中的一个字符替换模板中的一个匹配字符?

1 个答案:

答案 0 :(得分:1)

基本上您需要将简单模板转换为REGEX,然后使用REGEX执行此操作:

予。 创建替换

  • 搜索正则表达式^X+(\W)X+(\W)X+$替换为\\1\1\\2\2\\3
  • 这会将XXX-XXX-XXX转换为\1-\2-\3 explained demo here

II。 创建匹配 :(两步)

  1. 创建三个组:
    • 搜索正则表达式^(X+)\W(X+)\W(X+)$替换为(\1)(\2)(\3)
    • 这会将XXX-XXX-XXX转换为(XXX)(XXX)(XXX) explained demo here
  2. X替换为点(.作为单个字符匹配),超过上述操作
  3. 现在,您可以将新的匹配字符串(...)(...)(...)和新的替换字符串\1-\2-\3与输入字符串ABCDEFGHI一起使用,并获取ABC-DEF-GHI explained demo here

    注意:我假设您的模板会将输入字符串拆分为3个部分,其中包含2个(变量)特殊字符

    更新

    如果模板包含可变部件,则必须提前创建匹配替换模式:
    使用正则表达式:\W 计算模板中的部分,然后创建匹配和替换模式。