繁体   English   中英

无论顺序如何,街道地址的正则表达式(/<house><street> / 或者 /<street><house> /)</house></street></street></house>

[英]Regular expression for street address regardless of order (either /<house> <street>/ or /<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。 但这需要解析器对正则表达式进行语义分析,并且解析器确实不应该在初始分析中深入分析 go。 事实上,如果他们这样做了,您可以使用正则表达式解析器作为 SAT 求解器,这意味着在最坏的情况下解析正则表达式将是 NP-hard。

但是足够的题外话,这反而有效:

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块中以处理与任一模式都不匹配的地址。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM