【问题标题】:How to match string in between nth occurrence of whitespace and nth occurrence of comma?如何在第 n 次出现空格和第 n 次出现逗号之间匹配字符串?
【发布时间】:2019-10-16 17:05:33
【问题描述】:

我正在使用 PL/SQL 进行编辑。

我有以下字符串

59 W Grand Ave Chicago, IL 60654

我需要匹配字符串“Chicago”,我可以通过匹配第四个空格字符和第一个逗号字符之间的所有内容来做到这一点。到目前为止,我想出了:

(?<=\s)(.*)(?=,)

但是,即使它匹配到逗号的所有内容,它也是从第一个空格字符开始的。如何改为从第 4 个空格字符开始匹配?

我尝试了(?&lt;=\s){4}(.*)(?=,),但它什么都不匹配。

【问题讨论】:

  • 你在什么环境下实现这个正则表达式?
  • 我在 PL/SQL 中编辑
  • 根据您使用它的环境,只需使用/\S+,/U 确保您不使用g 标志。这只会捕获第一个逗号之前的单词

标签: sql regex


【解决方案1】:

这个表达式会有点复杂。让我们尝试另一种方法,也许专注于两个字母 State 并滑动回到之前的单词,使用类似于:

^.+?(\w+)[,\s]+?[A-Z]{2}.+$

Demo 1

我们可以看到,如果 City 有多个单词,我们将面临问题。但是,如果我们在城市之前有一个固定词列表,例如AveBLVDST,我们很可能会想出更好的表达方式,例如:

^.+Ave\s+(.+?)[,\s]+?[A-Z]{2}.+$

Demo 2

我们将其扩展为:

^.+(Ave|Street|ST|BLVD)\s+(.+?)[,\s]+?[A-Z]{2}.+$

Demo 3

正则表达式电路

jex.im 可视化正则表达式:

测试

const regex = /^.+Ave\s+(.+?)[,\s]+?[A-Z]{2}.+$/gm;
const str = `59 W Grand Ave Chicago, IL 60654
59 E Grand Hotel Ave Chicago IL 60654
59 E George Washington Ave New York, NY 60654
59 E George Washington Ave San Diego CA 60654
59 E George Washington Ave St. Petersburg, CA 60654`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

【讨论】:

  • 非常感谢 Emma 的帮助,我很感激学习这种方法。我注意到一件事,当我对正则表达式 101 进行正则表达式时,它似乎只在“第 1 组”中突出显示芝加哥,而不是完整匹配。有实际区别吗?
猜你喜欢
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多