分割正则表达式数字

时间:2019-04-26 12:01:17

标签: javascript regex

我想分割街道地址: 巴黎市街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]

谢谢

3 个答案:

答案 0 :(得分:1)

使用匹配比使用以下正则表达式更容易

[a-zA-Z]+(?: *[a-zA-Z]+)*|\d+|[^\w\s]

上述正则表达式的解释:

  • [a-zA-Z]+(?: *[a-zA-Z]+)*-匹配空格分隔的字母
  • |-交替
  • \d+-匹配一位或多位数字
  • |-交替
  • [^\w\s]-匹配一个或多个非单词非空格字符

Regex Demo

尝试这些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并声明字符串的结尾
  • )积极回望
  • |
  • (?=,)正向前进,断言右边直接是一个逗号

Regex demo

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);