вернуть n-ное совпадение из строки, используя регулярное выражение - PullRequest
0 голосов
/ 05 ноября 2018

Я использую Tableau для создания визуализации и мне нужно применить Regex к строковым значениям в моем наборе данных. Я пытаюсь использовать Regex для возврата n-го совпадения этой строки данных: b29f3b2f2b2f3b3f1r2f3 + b3x #. Данные всегда будут в одной строке, и мне нужно разбивать данные на подстроки каждый раз, когда встречаются символы b, s, f или d, и мне нужно соответствовать возвращаемое n-е вхождение. Например, при определении того, какое число соответствует возвращаемому, будет соответствовать следующее:

  • n = 1 соответствует b29
  • n = 2 совпадения f3
  • n = 3 совпадения b2
  • n = 4 совпадения f2
  • n = 5 совпадений b2
  • n = 6 совпадений f3
  • n = 7 совпадений b3
  • n = 8 совпадений f1r2
  • n = 9 совпадений f3 +
  • n = 10 соответствует b3x #

Я могу получить соответствие n = 1, чтобы вернуть правильное значение, используя bfsd (? = [Bfsd]), и попытался получить последующие значения для возврата, используя lookahead, но не могу найти регулярное выражение, которое работает. Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

если у вас есть gawk, это разделит поле ввода как вашу спецификацию

$ awk -v FPAT='[a-f][0-9rx#+]+' '{$1=$1}1'

$ echo "b29f3b2f2b2f3b3f1r2f3+b3x#" | 
  awk -v FPAT='[a-f][0-9rx#+]+' '{for(i=1;i<=NF;i++) print i " -> " $i}'


1 -> b29
2 -> f3
3 -> b2
4 -> f2
5 -> b2
6 -> f3
7 -> b3
8 -> f1r2
9 -> f3+
10 -> b3x#
0 голосов
/ 06 ноября 2018

Ваш шаблон товара [bfsd][^bfsd]*.

Вы можете использовать ^(?:.*?([bfsd][^bfsd]*)){n}, чтобы получить то, что вам нужно, просто обновите переменную n, указав нужное вам число.

Этот шаблон даст вам второе значение:

^(?:.*?([bfsd][^bfsd]*)){2} 

См. regex demo .

Детали

  • ^ - начало строки
  • (?:.*?([bfsd][^bfsd]*)){2} - два случая
    • .*? - любые 0+ символов, как можно меньше
    • ([bfsd][^bfsd]*) - b, f, s или d, за которыми следуют 0+ символов, отличных от b, f, s и d.
0 голосов
/ 05 ноября 2018

Вы можете использовать это регулярное выражение:

[bsfd][^bsfd]*

Используйте флаг 'global'.

Это создаст совпадения, которые начинаются с одной из четырех букв, за которыми следует любое количество других символов.

Результатом будет array со всеми совпадениями. Обратите внимание, что Array начинается с index 0 (не 1).

...