gpt4 book ai didi

正则表达式检测字符串中是否包含 printf 占位符

转载 作者:行者123 更新时间:2023-12-01 07:29:28 30 4
gpt4 key购买 nike

我正在寻找一个正则表达式,它可以正确检测字符串中是否存在 printf() 类型的占位符。

最佳答案

事实证明这比看起来要复杂一些,答案取决于您想对占位符做什么,以及您对 printf 和正则表达式使用的语言/规范。

为了给你一个实际的例子,这里是来自 sprintf.js 库的占位符正则表达式,它匹配它自己的 placeholder spec ,与 c++ spec 相似但不相同这与 php spec 相似但不相同:

placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fiosuxX])/,

您可以使用诸如 regex101 https://regex101.com/r/bV9nT8/1 之类的东西来很好地解释所有细节。但是有两个关键的事情需要考虑,这将是广泛相关的:

1) 开头的 '^':javascript Regexp 实现缺少\G "End of previous match" anchor ,这使得无法匹配相邻的占位符 ('%s%s' => ['%s','%s']) 同时忽略转义的 '%' 符号 ('%s%%s' => ['%s'])。因此,该库在尝试使用占位符正则表达式之前以编程方式处理纯文本和 %% 子字符串。

2) 捕获组:作为解析库的一部分,这个正则表达式捕获了很多它需要知道的东西:

  1. $1s 中的数字(参数索引)
  2. $(variableName)s 中的名称
  3. 括号后的+(如果存在)
  4. 0 或 ' 后跟另一个字符序列(我认为这是填充字符)
  5. 一个可选的 - 字符
  6. 更多位数(最小字段宽度)
  7. 更多位数(浮点精度)
  8. 类型说明符

根据您的目的,您可能需要这些东西的一个子集,或者可能一个都不想要,整个表达式只有一个捕获组,例如:

var regexForPlaceholders = /(?:\x25\x25)|(\x25(?:(?:[1-9]\d*)\$|\((?:[^\)]+)\))?(?:\+)?(?:0|'[^$])?(?:-)?(?:\d+)?(?:\.(?:\d+))?(?:[b-fiosuxX]))/g;
function placeholders(string ){
return ( string.match( regexForPlaceholders ) || [] )
.filter( function( v ) {
return v !== '\x25\x25';
} );
}

关于正则表达式检测字符串中是否包含 printf 占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915025/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com