Как вы можете удалить определенные экземпляры персонажа, но не все? - PullRequest
0 голосов
/ 24 апреля 2019

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

Борисова Светлана Александровна; КимХак Джоонг; PuXiaotao;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?; ?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?; ;;;;;;;;;;;;;;;;;;; LiuHung-вэнь *;?;?;?;? ;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;? ;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;? ;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;?;? ;;;;;;;;

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

Я использую KNIME и пытался использовать regexReplace($col1$,"[?;]","") или regexReplace($col1$,"?;","") в узле String Manipulation, но все случаи? а также ; удалены.

Я хочу, чтобы вывод был

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 24 апреля 2019

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

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

Для вашего ввода он производит:

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

Workflow showing the result and the regex

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

Используйте Regex: (?:;\?)+ и замените пустую строку, чтобы удалить ?;.Обратите внимание, что это соответствует 478 шагов. Демо

Затем используйте регулярное выражение: ([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")
...