Сплит регулярное выражение - PullRequest
1 голос
/ 26 апреля 2019

Я хочу разделить адрес улицы: 21 rue Poliveau, 75005 Paris

Мой вывод должен быть таким:

[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 ]

1 голос
/ 26 апреля 2019

Если вы хотите использовать split, вы можете использовать Lookbehind Assertions, большинство браузеров теперь поддерживают их, но, пожалуйста, проверьте, хотите ли вы, чтобы старые браузеры тоже работали.

Edit: Хорошо, я должен был сказать, что большинство браузеров выглядят так, как будто они поддерживают Это. Быстрый тест, и кажется, что Chrome является единственным банкоматом, и с что я предполагаю, что 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));
1 голос
/ 26 апреля 2019

Использовать совпадение проще, чем разделять, используя следующее регулярное выражение,

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

Edit:

Для поддержки акцентированных символов я добавляю регулярное выражение к этому, где диапазон À-ÿ должен охватывать необходимые символы в подарок. Также включая - и ', чтобы они также были захвачены в слове. Поведение может быть изменено / улучшено в соответствии с необходимостью, хотя. Просто дай мне знать. Это будет расширенное регулярное выражение,

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

Regex Demo с поддержкой акцентированных символов

Дайте мне знать для дальнейших запросов. Может быть сможет ответить чуть позже, так как будет по дороге домой.

0 голосов
/ 26 апреля 2019

В вашем шаблоне вы используете группу захвата для сопоставления всех отдельных символов в этом классе символов [(\d+),(\b)]

Символы, входящие в группу захвата, также возвращаются при разбиении, поэтому в результате вы получаете столько элементов.

Если вы хотите использовать split с вашими примерами данных, в вашей строке есть несколько мест, где вы можете сопоставить разделение на:

  • после цифры
  • Перед запятой
  • Перед словом в верхнем регистре в конце строки

Чтобы получить эти символы и позиции, вы можете использовать чередование

\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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...