не группа оракула регулярное выражение - PullRequest
0 голосов
/ 21 ноября 2018

Я ищу группу не регулярных выражений в запросе регулярных выражений оракула.Это означает, что я хочу сопоставить все шаблоны, которые не соответствуют группе регулярных выражений

Моя строка:

"G,1 = G"

Используется сопоставление с шаблоном:

([[:alpha:]]+\,*[[:digit:]]*)

Current_Output:

"grouped(G,-1) = grouped(G)"

Проблема: не шаблон.Сопоставить все выражения, которые не соответствуют

([[:alpha:]]+\,*[[:digit:]]*)

Обязательные выходные данные для вышеприведенного выражения:

"G,-1 group(=) G"

Другие факторы: "=" может быть любым оператором "(+-*=)"

Код:

SELECT  REGEXP_REPLACE('G,-1 = G',
                         '([[:alpha:]]+\,*[[:digit:]]*)', 
                        'grouped(\1)') 

                 as  "REGEXP_REPLACE_Concatenation"
FROM dual;

Буду признателен, если какой-либо из них поможет получить Not в регулярном выражении.

1 Ответ

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

Вы можете попробовать этот шаблон:

REGEXP_REPLACE(s,'([a-zA-Z]+,[0-9]+\s+)([^a-zA-Z0-9])(\s+[a-zA-Z]+)','\1group(\2)\3')

Я не использовал регулярное выражение Posix, которое вы использовали для простоты, и использовал [a-zA-Z] для алфавита и [0-9] для цифр.\s*? представляет ноль или более пробелов.

[^a-zA-Z0-9] пытается сопоставить ваш оператор, но он может совпадать с вашими действительными операторами, поэтому вы можете явно указать их как (\+|-|\*|=) вместо этого, если вы уверены во всех возможных операторах.

Я поместил левый операнд, оператор и правый оператор как группы (\1), (\2) и (\3) соответственно.

SQL>
SQL> with t(s) AS
  2  (
  3    SELECT 'G,1=G'      FROM  DUAL UNION ALL
  4    SELECT 'AB,13 + H'  FROM  DUAL UNION ALL
  5    SELECT 'BCD,1 * ID' FROM  DUAL
  6  )
  7  select s,REGEXP_REPLACE(s,'([a-zA-Z]+,[0-9]+\s*?)([^a-zA-Z0-9])(\s*?[a-zA-Z]+)'
  8                           ,'\1group(\2)\3')
  9  as m
 10  FROM t;

S            M
--           --
G,1=G        G,1group(=)G
AB,13 + H    AB,13 group(+) H
BCD,1 * ID   BCD,1 group(*) ID

Демонстрация

Кроме того, если вы не хотите, чтобы шаблон был конкретным до или после оператора, и только хотите сгруппировать оператора, вы можете использовать:

REGEXP_REPLACE(s,'([^\+-\*=]+)(\+|-|\*|=)([^\+-\*=]+)' ,'\1group(\2)\3')

...