Регулярное выражение для сопоставления каналов без подстроки между ними

Может ли кто-нибудь поделиться регулярным выражением, чтобы соответствовать только каналам без подстроки между ними?

Например:

ABC, XYZ, |||,|||||, ||G|F|,1|2, ||||, R|T|Y

Я хочу только ||| и ||||| и |||| выбрано.

Заранее спасибо за помощь.

Редактировать:

Используя помощь людей в комментариях ниже. У меня есть частично работающее регулярное выражение (?‹=^|,\s)?(\|+)(?=,|,$)

Однако при этом выбирается | после F в подстроке ||G|F|

Можно ли каким-либо образом изменить это регулярное выражение, чтобы выбирать каналы только между запятыми, между которыми нет строк?


person brandon lee    schedule 07.05.2020    source источник
comment
Что-то вроде (?:^|,)\s*(\|+)(?:,|$)? Вы можете получить доступ к каналам, используя первую группу захвата. Демонстрация: regex101.com/r/ca3kRR/1   -  person 41686d6564    schedule 08.05.2020
comment
Эй, спасибо за ваш ответ. Но регулярное выражение, похоже, также захватывает начальные и конечные запятые. Я просто хочу выбрать трубы @AhmedAbdelhameed   -  person brandon lee    schedule 08.05.2020
comment
Как я уже сказал, вы можете найти только трубы в группе №1. К сожалению, я не знаком с механизмом регулярных выражений, который вы используете, поэтому я не могу сказать, есть ли лучший вариант (Lookarounds, \K и т. д.), который подойдет вам. Это универсальное решение, которое должно работать практически с любым типом регулярных выражений.   -  person 41686d6564    schedule 08.05.2020
comment
Я использую это в процессоре Nifi Replace Text, который использует регулярные выражения JAVA @AhmedAbdelhameed.   -  person brandon lee    schedule 08.05.2020
comment
В , ||G|F|,1|2,||||, вы снимаете только ||||. Почему бы не || в начале этой строки, поскольку между этими двумя каналами нет подстроки?   -  person Cary Swoveland    schedule 08.05.2020
comment
Что ж, если после запятой всегда будет ноль или один пробел, я считаю, что (?<=^|,\s?)(\|+)(?=,|$) должен работать в Java. Если может быть любое количество пробелов, я не думаю, что это будет возможно без захвата групп (которые не так уж плохи, если вы знаете, как их использовать).   -  person 41686d6564    schedule 08.05.2020
comment
@CarySwoveland По сути, я хочу захватить каналы между запятыми без подстроки между ними. Так что в этом случае || в начале ||G|F| не считается   -  person brandon lee    schedule 08.05.2020
comment
@brandonlee Что ж, тогда синтаксис не поддерживается вашим движком регулярных выражений. Используйте группы захвата. Оставайтесь на безопасной стороне.   -  person 41686d6564    schedule 08.05.2020


Ответы (1)


Вы не указали язык, которым пользуетесь. Если он поддерживает \K, как это делает PCRE (PHP) и другие, вы извлекаете подстроки, соответствующие следующему регулярному выражению.

(?:^|,)[^,|]*\K\|{2,}(?=[^,|]*(?:,|$))

Демо

Механизм регулярных выражений выполняет следующие операции.

(?:^|,)     # match start of string or ',' in a non-capture group
[^,|]*      # match 0+ chars other than ',' and '|'
\K          # forget everything matched so far
\|{2,}      # match 2+ '|'  
(?=
  [^,|]*    # match 0+ chars other than ',' and '|'
  (?:,|$)   # match a comma or the end of the string 
)           # end non-capture group 

Взято из демонстрационной ссылки: «\K сбрасывает начальную точку сообщаемого совпадения».

Если вы хотите сопоставить одиночные трубы между запятыми (например, ,1|2,), измените {2,} на +.

Если \K не поддерживается, но можно использовать группу захвата, можно использовать следующее регулярное выражение.

(?:^|,)[^,|]*(\|{2,})(?=[^,|]*(?:,|$))

Демо

Интересующие строки удерживаются в группе захвата 1 для каждого совпадения.

person Cary Swoveland    schedule 07.05.2020
comment
Это работает очень хорошо. Большое спасибо. Я использую регулярное выражение Java в процессорах Nifi. Знаете ли вы, чем я могу заменить \K, чтобы соответствовать регулярному выражению Java? - person brandon lee; 08.05.2020
comment
Я сделал небольшое изменение и дам объяснение. Вы подтвердили, что \K поддерживается? - person Cary Swoveland; 08.05.2020
comment
Нет, \K не поддерживается. Пытаюсь найти равноценную замену - person brandon lee; 08.05.2020
comment
Альтернативой может быть отрицательный просмотр переменной длины, но я не думаю, что это поддерживается Java. Не могли бы вы вместо этого использовать группу захвата? - person Cary Swoveland; 08.05.2020
comment
Я добавил альтернативу без \K, которая использует группу захвата, если это будет полезно. - person Cary Swoveland; 08.05.2020