我想分割街道地址: 巴黎市街21号,邮政编码75005
我的输出必须像:
[21]
[rue Poliveau]
[,]
[75005]
[Paris]
这是用于HTML脚本(网站Angular)
var regex = /\s?([(\d+),(\b)])\s?/;
var resultat = query.split(regex);
for(var i=0; i<resultat.length;i++)
{console.log(resultat[i]);
尽管\ d +我的输出是:
[2]
[1]
[rue Poliveau]
[,]
[7]
[5]
[0]
[0]
[5]
[Paris]
谢谢
答案 0 :(得分:1)
使用匹配比使用以下正则表达式更容易
[a-zA-Z]+(?: *[a-zA-Z]+)*|\d+|[^\w\s]
上述正则表达式的解释:
[a-zA-Z]+(?: *[a-zA-Z]+)*
-匹配空格分隔的字母|
-交替\d+
-匹配一位或多位数字|
-交替[^\w\s]
-匹配一个或多个非单词非空格字符尝试这些JS代码,
var s = '21 rue Poliveau, 75005 Paris'
console.log(s.match(/[-'a-zA-ZÀ-ÿ]+(?: *[-'a-zA-ZÀ-ÿ]+)*|\d+|[^\w\s]/g))
s = "25 chemin de l'école, Saint-Rémy-de-Provence"
console.log(s.match(/[-'a-zA-ZÀ-ÿ]+(?: *[-'a-zA-ZÀ-ÿ]+)*|\d+|[^\w\s]/g))
编辑:
为了支持重音符号,我正在对此进行正则表达式增强,其中À-ÿ
范围应涵盖当前所需的字符。还包括-
和'
,因此它们也被单词捕获。行为可以根据需要进行更改/增强。请让我知道。
[-'a-zA-ZÀ-ÿ]+(?: *[-'a-zA-ZÀ-ÿ]+)*|\d+|[^\w\s]
Regex Demo supporting accentuated chars
让我知道进一步的查询。也许可以稍等一下,就像回家一样。
答案 1 :(得分:1)
如果要使用split,则可以使用Lookbehind Assertions,大多数浏览器现在似乎都支持它们,但是请检查是否要允许较旧的浏览器也可以使用。
编辑:好的,我应该说大多数浏览器看起来都将支持 它。快速测试,看来Chrome是唯一的一个atm,并且 我认为Node.js也可以。所以这个解决方案可能是 将来更有用。所以我将其保留在此处,并发出警告 关于兼容性。
基本上是3个分割,两个负向后看,正向1个往后看。
(?<=\d)
(注意末尾的空格)..找到数字但不捕获,然后在空间上分割
(?<=\w,)
(请再次注意空格)..找到任何字符char和逗号,不要捕获并空格。
(?=,)
以逗号分隔,不捕获而保留在输出中。
const str1 = "21 rue Poliveau, 75005 Paris";
const str2 = "25 chemin de l'école, Sainte-Mère-Églis";
const re_split = /(?<=\d) |(?<=\w,) |(?=,)/;
console.log(str1.split(re_split));
console.log(str2.split(re_split));
答案 2 :(得分:0)
在您的模式中,您正在使用捕获组来匹配此字符类[(\d+),(\b)]
中的所有单个字符
在拆分时也会返回捕获组中的字符,这就是为什么结果中包含很多项的原因。
如果您想对示例数据使用split,则可以在字符串中的一些位置进行匹配以进行分割:
要获取这些字符和位置,您可以使用alternation
\s(?=[a-z]|\d|[A-Z][a-z]+$)|(?=,)
\s
匹配空白字符(?=
正向前进,断言右边直接是
[a-z]|\d|[A-Z][a-z]+$
匹配a-z或数字或大写字母,后跟1+小写a-z并声明字符串的结尾)
积极回望|
或(?=,)
正向前进,断言右边直接是一个逗号
let query = "21 rue Poliveau, 75005 Paris";
var regex = /\s(?=[a-z]|\d|[A-Z][a-z]+$)|(?=,)/g;
var resultat = query.split(regex);
console.log(resultat);