Как вы можете удалить определенные экземпляры символа, но не все?

#regex #knime

#регулярное выражение #knime

Вопрос:

У меня есть список имен, разделенных точкой с запятой:

БорисоваСветлана А.;КимХак Joong;PuXiaotao;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;LiuHung-wen*;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?

Я хотел бы удалить все «?;», но только если они встречаются в этом шаблоне.

Я использую KNIME и пытался использовать regexReplace($col1$,"[?;]","") or regexReplace($col1$,"?;","") в узле обработки строк, но все экземпляры ? и ; удалены.

Я хочу, чтобы результат был

БорисоваСветлана А.; КимХак Чжун; Пусяотао; Люхунг-вен*

но фактический результат

БорисоваСветлана А.КимХак ДжунгПуКсиотаоЛиуХунг-вен*

Я был бы очень признателен за любые указания в правильном направлении, поскольку я новичок как в KNIME, так и в regex.

Комментарии:

1. Попробуйте regexReplace($col1$,"([?];) ","") или "([?];){2,}"

2. Или попробуйте regexReplace($col1$,"(;[?]) ","") или "(;[?]){2,}"

3. regexReplace($col1$,"(;[?]) ","") сработало отлично, спасибо!

Ответ №1:

Вы можете избежать ? вместо того, чтобы помещать его в альтернативные варианты, подобные этому: ? . Поскольку необходимо экранировать из-за кавычек, правильное экранирование находится \? внутри строки. Итак, для вашего запроса должно сработать следующее:

 regexReplace($col1$,"\?;","")
  

Для вашего ввода он выдает:

 BorisovaSvetlana A.;KimHak Joong;PuXiaotao;LiuHung-wen*;?
  

Рабочий процесс, показывающий результат и регулярное выражение

Комментарии:

1. Спасибо. Это было бы идеально, если бы «;?» в конце каждой записи также можно было исключить.

2. Я думаю, что на самом деле вы хотели противоположный порядок элементов, но мой ответ соответствовал тому, о чем вы просили. Итак, следующее должно выполнять то, что вы хотите: regexReplace($col1$,";\?","")

Ответ №2:

Используйте регулярное выражение: (?:;?) и замените на пустую строку, чтобы удалить ?; . Пожалуйста, обратите внимание, что это соответствует 478 шагам. ДЕМОНСТРАЦИЯ

Затем используйте Regex: ([A-Z][a-z *.-] )([A-Z][A-Za-z *.-] )(?=;|$) и замените на $1, $2 , чтобы получить ожидаемый результат. ДЕМОНСТРАЦИЯ

 regexReplace(regexReplace($col1$,"(?:;?) ",""), "([A-Z][a-z *.-] )([A-Z][A-Za-z *.-] )(?=;|$)", " $1, $2")
  

Комментарии:

1. Спасибо. Пробовал это, но это просто удалило все «;», но ни один из «?».