街道地址的正则表达式,不考虑顺序(/<house> <street>/ 或 /<street> <house>/)



我试图将街道地址解析为街道名称和门牌号码,但我希望门牌号码出现在街道名称之前或之后。以下代码产生语法错误:

const { groups: { house, street } } = streetAddress.match(/^(?<house>d+)s+(?<street>.*)|(?<street>.*)s+(?<house>d+)$/);
SyntaxError: Invalid regular expression: /^(?<house>d+)s+(?<street>.*)|(?<street>.*)s+(?<house>d+)$/: Duplicate capture group name

有没有一种优雅的方法可以做到这一点?

我认为使用命名捕获组不可能做到这一点。我知道,从逻辑上讲,组名不会重复,因为那里有一个OR。但这需要语法分析器对正则表达式进行语义分析,而语法分析器在最初的分析中不应该做得那么深入。事实上,如果他们这样做了,您可以使用正则表达式解析器作为SAT求解器,这意味着在最坏的情况下解析正则表达式将是NP困难的。

但题外话够多了,这反而奏效了:

const streetAddress = process.argv[2];
const groups = streetAddress.match(/^(d+)s+(.*)|(.*)s+(d+)$/);
const house = groups[1] || groups[4];
const street = groups[2] || groups[3];
console.log({house, street});

示例:

> node x.js "1234 Mongomery"
{ house: '1234', street: 'Mongomery' }
> node x.js "Neuer Weg 1234"
{ house: '1234', street: 'Neuer Weg' }

我提出了这个解决方案,我认为它相当优雅:

const { groups: { house, street } } =
streetAddress.match(/^(?<house>d+)s+(?<street>.*)$/) || 
streetAddress.match(/^(?<street>.*)s+(?<house>d+)$/);

(它可能需要封装在try块中,以处理与两种模式都不匹配的地址。(

最新更新