Регулярное выражение: разделение строки символов с помощью непоследовательного шаблона (Oracle) (POSIX ERE) - PullRequest
0 голосов
/ 18 сентября 2018

РЕДАКТИРОВАТЬ: Этот вопрос относится к реализации Oracle regex (POSIX ERE), которая не поддерживает 'lookaheads'

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

Корпус: 1710ABCD.131711ABCD.431711ABCD.41711ABCD.4041711ABCD.25

Шаблон в основном состоит из 4 цифр, за которыми следуют 4 символа, затем точка, затем 1,2 или 3 цифры!Чтобы сделать приведенную выше строку понятной, вот так она выглядит как разделенная пробелом 1710ABCD.13 1711ABCD.43 1711ABCD.4 1711ABCD.404 1711ABCD.25

Таким образом, вывод операции замены должен выглядеть следующим образом:

1710ABCD.13,1711ABCD.43,1711ABCD.4,1711ABCD.404,1711ABCD.25

Я смогчтобы соответствовать шаблону с помощью этого регулярного выражения:

(\d{4}\w{4}\.\d{1,3})

Он вставляет запятую, но после третьей цифры за точкой (неправильно, должно быть после второй цифры), но я не могу заставить ее это сделатьв правильном положении и глобально.

Вот ссылка на скрипку https://regex101.com/r/qQ2dE4/329

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Чтобы расширить ответ @ CertainPerformance, если вы хотите иметь возможность сопоставить последний токен, вы можете использовать альтернативное совпадение $:

(\d{4}\w{4}\.\d{1,3})(?=\d{4}|$)

Демо: https://regex101.com/r/qQ2dE4/331

РЕДАКТИРОВАТЬ: так как вы теперь упомянули в комментарии, что вы используете реализацию Oracle, вы можете просто сделать:

regexp_replace(corpus, '(\d{1,3})(\d{4})', '\1,\2')

чтобы получить желаемый результат:

1710ABCD.13,1711ABCD.43,1711ABCD.4,1711ABCD.404,1711ABCD.25

Демо: https://regex101.com/r/qQ2dE4/333

0 голосов
/ 18 сентября 2018

Чтобы продолжить поиск совпадений после первого, вы должны использовать g флаг lobal /g. Шаблон очень сложный, но это возможно, если вы перевернете строку.

Демо

var str = `1710ABCD.131711ABCD.431711ABCD.41711ABCD.4041711ABCD.25`;

// Reverse String
var rts = str.split("").reverse().join("");

// Do a reverse version of RegEx
/*In order to continue searching after the first match,
use the `g`lobal flag*/
var rgx = /(\d{1,3}\.\w{4}\d{4})/g;

// Replace on reversed String with a reversed substitution
var res = rts.replace(rgx, ` ,$1`);

// Revert the result back to normal direction 
var ser = res.split("").reverse().join("");

console.log(ser);
0 голосов
/ 18 сентября 2018

Все, что вам нужно, это заглянуть в конец регулярного выражения, чтобы жадный \d{1,3} возвратился, пока за ним не следуют 4 цифры (обозначающие начало следующей подстроки):

(\d{4}\w{4}\.\d{1,3})(?=\d{4})
                     ^^^^^^^^^

https://regex101.com/r/qQ2dE4/330

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