![](/img/trans.png)
[英]An efficient algorithm for finding the house number on the opposite side of the street
[英]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.