正则表达式-仅匹配数字值周围的引号

时间:2019-01-24 17:43:50

标签: regex

因此,我使用大量的正则表达式来格式化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'

我只想在'48206505周围匹配0,所以我可以将它们剥离。

为了安全起见,假设测试字符串中可能还会出现其他字符。即-说只匹配不包含破折号,字母或点的任何内容并不是真的可行。此外,该问题与语言无关,因此任何适用的语言都可以-JavaScript,Python,Java等。

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式选择所有此类数字,

'(\d+)'

然后根据您的语言将其替换为\1$2

Demo

这将消除所有围绕数字的引号。

让我知道这是否对您有用。

另外,作为一种替代解决方案,如果您的正则表达式引擎支持ECMAScript 2018,那么您可以利用可变长度后视,并使用此正则表达式仅选择包含数字的引号,

'(?=\d+')|(?<='\d+)'

并将其替换为空字符串。

Demo

请确保您在支持该功能的Chrome浏览器中检查了该演示,而不是在不支持它的Mozilla中检查了演示。

答案 1 :(得分:1)

您可以在捕获组中的第一个正则表达式中捕获单引号或双引号,然后捕获组2中之间的数字,最后使用向后引用到组1

例如,使用第二个捕获组$2

(['"])(\d+)\1

说明

  • (['"])在捕获组中捕获'或'
  • (\d+)分组捕获1位以上的数字
  • \1对组1的反向引用

Regex demo

结果

''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);