因此,我使用大量的正则表达式来格式化SQL。
我正在尝试匹配数字值(INT)周围的所有引号,以便将其删除。
我用它来匹配qoutes中的数字:
(?<=(['"])\b)(?:(?!\1|\\)[0-9]|\\.)*(?=\1)
到目前为止已经玩了,但是还没有运气:
'(?=[0-9](?='))*
我想说的是向前看无穷大,匹配任何数字,除非它是引号然后接受然后匹配。
任何正则表达式忍者都可以帮助我上路吗?
这是一个示例字符串:
'2018-12-09 07:29:00.0000000', 'US', 'MI', 'Detroit', '48206', '505', '68.61.112.245', '0', 'Verizon'
我只想在'
,48206
和505
周围匹配0
,所以我可以将它们剥离。
为了安全起见,假设测试字符串中可能还会出现其他字符。即-说只匹配不包含破折号,字母或点的任何内容并不是真的可行。此外,该问题与语言无关,因此任何适用的语言都可以-JavaScript,Python,Java等。
答案 0 :(得分:1)
您可以使用此正则表达式选择所有此类数字,
'(\d+)'
然后根据您的语言将其替换为\1
或$2
。
这将消除所有围绕数字的引号。
让我知道这是否对您有用。
另外,作为一种替代解决方案,如果您的正则表达式引擎支持ECMAScript 2018,那么您可以利用可变长度后视,并使用此正则表达式仅选择包含数字的引号,
'(?=\d+')|(?<='\d+)'
并将其替换为空字符串。
请确保您在支持该功能的Chrome浏览器中检查了该演示,而不是在不支持它的Mozilla中检查了演示。
答案 1 :(得分:1)
您可以在捕获组中的第一个正则表达式中捕获单引号或双引号,然后捕获组2中之间的数字,最后使用向后引用到组1
例如,使用第二个捕获组$2
(['"])(\d+)\1
说明
(['"])
在捕获组中捕获'或'(\d+)
分组捕获1位以上的数字\1
对组1的反向引用结果
''2018-12-09 07:29:00.0000000', 'US', 'MI', 'Detroit', 48206, 505, '68.61.112.245', 0, 'Verizon''
答案 2 :(得分:1)
.split().join()
链条 .split()
可以使用正则表达式,例如:
/'\b([0-9]+?)\b'/
文字匹配单引号: '
元序列单词边界设置单词/数字的开头:\b
捕获组:(
类别范围:任何数字的[
:0-9]
至少匹配一次,然后继续进行直到到达下一个单词边框和直截了当的单引号:)+?\b'
由于.split()
遍历字符串,因此不需要g
全局标志。 .join('');
链接到.split()
,结果返回到am数组中的字符串。
var strA = `'2018-12-09 07:29:00.0000000', 'US', 'MI', 'Detroit', '48206', '505', '68.61.112.245', '0', 'Verizon'`;
var strB = strA.split(/'\b([0-9]+?)\b'/).join('');
console.log(strB);