RegEx для сопоставления всего, кроме слов, начинающихся со знака плюс - PullRequest
0 голосов
/ 25 мая 2019

Пример строки: +Z XA( 0,1,6,22,26,33,34,35,36,25,24) +DD +I +M >x1 >bdz +A

Результат должен быть: +Z +DD +I +M +A или Z DD I M A

Регулярное выражение (\+\w+), кажется, находит все токены, но я не знаю, какопределить шаблон замены.Я хотел бы удалить все остальное.

Я использую Omnis7, но движок regex - это скомпилированная библиотека Delphi, которую я использовал для расширения Omnis7.Движок регулярных выражений - это полная реализация регулярных выражений.Я попытался найти регулярное выражение с помощью онлайн-инструмента регулярных выражений (regex101.com).

Как мне решить эту проблему?

Ответы [ 4 ]

4 голосов
/ 25 мая 2019

Использование:

  • Найти: (\+\w+\h?)|.
  • Заменить: $1

Демо

2 голосов
/ 25 мая 2019

Это один из способов сделать это

Найти (?:(?!\+\w)[\S\s])*\+(\w+)(?:(?!\+\w)[\S\s])*
Заменить $1

https://regex101.com/r/MAW3fT/1

Расширен

 (?:
      (?! \+ \w )
      [\S\s] 
 )*
 \+ 
 ( \w+ )                       # (1)
 (?:
      (?! \+ \w )
      [\S\s] 
 )*

Хотя другой ответ выглядит простым, он в 2 раза медленнее, чем этот.

Тесты

Regex1:   (\+\w+\h?)|.+?
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   49
Elapsed Time:    2.06 s,   2056.43 ms,   2056428 µs
Matches per sec:   1,191,386


Regex2:   (?:(?!\+\w)[\S\s])*\+(\w+)(?:(?!\+\w)[\S\s])*
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   5
Elapsed Time:    1.00 s,   997.28 ms,   997281 µs
Matches per sec:   250,681

Что следует заметить, так как они совпадают правильно, поэтому прошедшее время
погода здесь Где мое регулярное выражение заняло половину времени.

0 голосов
/ 28 мая 2019

Спасибо всем здесь.Я поиграл с ним и нашел точное решение:
Поиск: +Z XA( 0,1,6,22,26,33,34,35,36,25,24) +DD +I +M >x1 >bdz +A
Найти: (\+)(\w+\h?)(.?)|.

  1. Заменить: $1$2$3
    Результат: +Z +DD +I +M +A

или

Заменить: $2$3
Результат: Z DD I M A
0 голосов
/ 25 мая 2019

Только что успел остановиться на потенциальной схеме, но увидел, что вы уже нашли свой ответ.Вот предложение, тем не менее.

Найти: (?<![+\w])[^+][\w\W]+?\s

Заменить: ''

https://regex101.com/r/cXceQO/1/

...