Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заменить регистр некоторых слов / 25 сообщений из 28, страница 1 из 2
04.01.2022, 12:10
    #40124632
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Добрый день!
Нужно заменить регистр некоторых слов в текстовом поле.
Например
Код: plsql
1.
REGEXP_REPLACE(FieldName, '(\W|^)(Слово1|Слово2|Слово3)(\W|$)', UPPER('\1\2\3'),1,0,'i') 


Я вижу два варианта решения:
1. Нужно использовать для таких целей функцию.
2. Разбивать строку на три части (до слова, слово, после слова) и для средней части менять регистр.
Может будут еще идеи как это проще сделать?
...
Рейтинг: 0 / 0
04.01.2022, 13:26
    #40124643
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
SergiiW,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t(s) as (
select 'Вначале было Слово1 Слово2 Слово3 слово4 Слово5' from dual
)
select 
replace(replace(replace(s
,'Слово1','СЛОВО1')
,'Слово2','СЛОВО2')
,'Слово5','СЛОВО5')
as ss
from t
;
SS
--------------------------------------------------------------------------------
Вначале было СЛОВО1 СЛОВО2 Слово3 слово4 СЛОВО5
...
Рейтинг: 0 / 0
04.01.2022, 13:44
    #40124645
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Vadim Lejnin,

Если бы все было так просто. :(
Слово может содержаться в тексте как часть другого слова, поэтому и использовался паттерн '(\W|^)(Слово1|Слово2|Слово3)(\W|$)'
...
Рейтинг: 0 / 0
04.01.2022, 13:47
    #40124647
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
SergiiW,

памятка:
HOWTO :: Как правильно задавать вопросы
Как мне оформить свое сообщение?
Студентам, желающим помощи

1) Полная постановка задачи (без сокращений)

2) Подготовьте тестовые данные, лучше в виде with
пример (не ваш случай) в конце

3) Покажите что сделали, что получили, без сокращений. ( лучше не в виде screenshot)

4) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение

Пример подготовленных данных, запроса и вывода.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
-- table 1 with column list
with user_tab(user_id,user_name,registry_date) as (
select 1,'Bob',to_date('11.02.1921 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 2,'Max',to_date('11.02.1922 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual union all
select 3,'Jon',to_date('11.02.1923 23:04:44','DD.MM.YYYY HH24:MI:SS') from dual
)
-- table 2 with column list
,user_post(post_id,user_id,parent_post_id,post_date,message) as (
select 100,1,null,to_date('11.02.1923 23:04:00','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 101,2,100,to_date('11.02.1923 23:05:23','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 102,3,100,to_date('11.02.1923 23:05:35','DD.MM.YYYY HH24:MI:SS'),'Hi' from dual union all
select 103,1,102,to_date('11.02.1923 23:06:00','DD.MM.YYYY HH24:MI:SS'),'How are you' from dual union all
select 104,2,102,to_date('11.02.1923 23:07:05','DD.MM.YYYY HH24:MI:SS'),'All right!' from dual union all
select 105,1,101,to_date('11.02.1923 23:06:21','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 106,1,104,to_date('11.02.1923 23:04:37','DD.MM.YYYY HH24:MI:SS'),'Bye' from dual union all
select 107,2,null,to_date('11.02.1923 23:08:56','DD.MM.YYYY HH24:MI:SS'),'Hmm' from dual
)
select
rpad(to_char(p.post_date,'YYYY-MM-DD HH24:MI:SS  '),20+level*2,' ')||u.user_name||': '||p.message as txt
from 
 user_post p
 join user_tab  u on ( p.user_id = u.user_id)
where p.post_date >= u.registry_date
start with p.parent_post_id is null 
connect by prior p.post_id=p.parent_post_id 
;

TXT
--------------------------------------------------------------------------------
1923-02-11 23:04:00   Bob: Hi
1923-02-11 23:05:23     Max: Hi
1923-02-11 23:06:21       Bob: Bye
1923-02-11 23:05:35     Jon: Hi
1923-02-11 23:06:00       Bob: How are you
1923-02-11 23:07:05       Max: All right!
1923-02-11 23:04:37         Bob: Bye
1923-02-11 23:08:56   Max: Hmm

8 rows selected.
...
Рейтинг: 0 / 0
04.01.2022, 14:10
    #40124649
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Vadim Lejnin,

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

ЗЫ
Уважаемый, для того чтобы сделать ссылку на произведение Льва Толстого "Война и мир" совсем не обязательно приводить его полный текст. Достаточно сделать ссылку и, желательно, на конкретную фразу, которая Вам непонятна или не нравиться.
...
Рейтинг: 0 / 0
04.01.2022, 14:21
    #40124651
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
И прошу обратить внимание, что исходный текст может быть в любом регистре. Для этого я указал поиск без учета регистра 'i'
Код: plsql
1.
REGEXP_REPLACE(FieldName, '(\W|^)(Слово1|Слово2|Слово3)(\W|$)', UPPER('\1\2\3'),1,0,'i') 


Приведу пример
Строка входная 'Текст1 теКст2 Текст1Текст2'
Слово Текст2
Строка на выходе 'Текст1 ТЕКСТ2 Текст1Текст2'
...
Рейтинг: 0 / 0
04.01.2022, 14:37
    #40124655
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Или еще пример
Строка входная 'Текст1 Кст-Текст2'
Слово поиска 'кст'
Строка на выходе 'Текст1 КСТ-Текст2'
...
Рейтинг: 0 / 0
04.01.2022, 19:00
    #40124689
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
SergiiW
Уважаемый
Совковец, не следует огрызаться, прося помощи.
Функция, раскладывающая предложение в слова, преобразующая и далее собирающая предложение.
RE тут только как помощник в разложении на слова.
...
Рейтинг: 0 / 0
04.01.2022, 20:00
    #40124699
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Elic
Функция, раскладывающая предложение в слова, преобразующая и далее собирающая предложение.
RE тут только как помощник в разложении на слова.

Спасибо!
Уже понял, что других вариантов, по сути нет, - сделал функцию.
...
Рейтинг: 0 / 0
04.01.2022, 20:03
    #40124700
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Elic
Совковец, не следует огрызаться, прося помощи.
Даже давая ответы, не стоит вешать ярлыки. Я из СССР, но не "Совковец".
...
Рейтинг: 0 / 0
04.01.2022, 21:04
    #40124703
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
SergiiW,

оракловые и java регулярки к сожалению не поддерживают перловые модификаторы \U \L (в перле было бы просто s/\b(word1|word2|word3)\b/\U$1/g), поэтому без MLE чисто регулярками не получится.
Функцией, конечно, будет правильнее и эффективнее, но в крайнем случае можно поизвращаться, типа:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with
 t(s) as (
    select 'Вначале было СловоX Слово2 Слово3 слово4 Слово5' from dual union all
    select 'Вначале было Слово1 СловоX Слово3 слово4 Слово5' from dual union all
    select 'Вначале было Слово1 Слово2 СловоX слово4 Слово5' from dual union all
    select 'Вначале было что-то' from dual
 )
,words(n,word) as (
    select rownum,column_value from table(sys.odcivarchar2list('Слово1','Слово2','Слово3'))
 )
,to_upper(str, x) as (
    select s, (select count(*) from words) from t
    union all
    select regexp_replace(str,'(\W|^)('||word||')','\1'||upper(word)||'\3')
          ,x-1
    from to_upper, lateral(select word from words where n=to_upper.x)
    where x>=0
 )
select str
from to_upper
where x=0
order by str
/

...
Рейтинг: 0 / 0
04.01.2022, 21:19
    #40124704
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
SergiiW
не стоит вешать ярлыки. Я из СССР, но не
Ты сам на себя навесил ярлык этого чудовищного образования.
...
Рейтинг: 0 / 0
04.01.2022, 21:53
    #40124706
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Sayan Malakshinov
оракловые и java регулярки к сожалению не поддерживают перловые модификаторы \U \L
Но java, к счастью, позволяет применить произвольную функцию к найденному слову. В отличие от Oracle.
В Java 9 (которая пока недоступна в Oracle DB) это вообще сделали по человечески наконец-то.
...
Рейтинг: 0 / 0
04.01.2022, 22:55
    #40124710
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Sayan Malakshinov
SergiiW,

оракловые и java регулярки к сожалению не поддерживают перловые модификаторы \U \L (в перле было бы просто s/\b(word1|word2|word3)\b/\U$1/g), поэтому без MLE чисто регулярками не получится.
Функцией, конечно, будет правильнее и эффективнее, но в крайнем случае можно поизвращаться, типа:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with
 t(s) as (
    select 'Вначале было СловоX Слово2 Слово3 слово4 Слово5' from dual union all
    select 'Вначале было Слово1 СловоX Слово3 слово4 Слово5' from dual union all
    select 'Вначале было Слово1 Слово2 СловоX слово4 Слово5' from dual union all
    select 'Вначале было что-то' from dual
 )
,words(n,word) as (
    select rownum,column_value from table(sys.odcivarchar2list('Слово1','Слово2','Слово3'))
 )
,to_upper(str, x) as (
    select s, (select count(*) from words) from t
    union all
    select regexp_replace(str,'(\W|^)('||word||')','\1'||upper(word)||'\3')
          ,x-1
    from to_upper, lateral(select word from words where n=to_upper.x)
    where x>=0
 )
select str
from to_upper
where x=0
order by str
/


Спасибо! Функцией действительно проще и, надеюсь, быстрее.
...
Рейтинг: 0 / 0
06.01.2022, 09:47
    #40124940
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
just for fun

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
using System.Text.RegularExpressions;

namespace regexclr
{
    public class Class1
    {
        public static string StoredProcedure1(string str, string pattern)
        {
            return Regex.Replace(str, pattern, m => m.ToString().ToUpper());
        }
    }
}


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> create or replace FUNCTION c#regex(STR VARCHAR2, PATTERN VARCHAR2) RETURN VARCHAR2 AUTHID CURRENT_USER IS
  2  BEGIN
  3    DECLARE
  4    BEGIN
  5      DBMS_CLR.CLEARPARAMETERS;
  6      DBMS_CLR.SETVARCHARPARAM(STR, DBMS_CLR.INPARAM, DBMS_CLR.SYSTEM_STRING);
  7      DBMS_CLR.SETVARCHARPARAM(PATTERN, DBMS_CLR.INPARAM, DBMS_CLR.SYSTEM_STRING);
  8      RETURN DBMS_CLR.EXECUTEVARCHARFUNCTION('REGEXCLR_DLL', 'regexclr.Class1', 'StoredProcedure1', DBMS_CLR.unSAFE, 'VSVER=4.0;');
  9    END;
 10  END;
 11  /

Function created.

SQL>
SQL> select c#regex('Text1 teXt2 Text1Text2 Xt-Text2', '(?i)\b(xt|text2)(?-i)') x from dual;

X
--------------------------------------------------------------------------------
Text1 TEXT2 Text1Text2 XT-TEXT2

SQL>


https://docs.oracle.com/en/database/oracle/oracle-database/21/clrnt/demo.html
...
Рейтинг: 0 / 0
06.01.2022, 17:06
    #40124988
SergiiW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Кобанчег,

Спасибо! Не знал о такой возможности.
Интересное решение, но, к сожалению, у меня нет соответствующих прав.
Сейчас это уже не важно. Написал обычную функции Oracle и она работает достаточно быстро.
Еще раз спасибо, буду знать о такой возможности на будущее.
...
Рейтинг: 0 / 0
06.01.2022, 21:59
    #40125036
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
хотел показать пример как легко сделать через XQuery функцию, но в самом начале нарвался на баги оракловой реализации fm:replace:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
SQL> ;
  1  with
  2   t(s) as (
  3      select 'wOrD1' from dual union all
  4      select 'wOrD1 WORD2' from dual union all
  5      select 'wOrD1 WORD2 WoRd3' from dual union all
  6      select 'wOrD1 WORD2 WoRd3 Word4 Word5' from dual union all
  7      select 'WoRd3' from dual union all
  8      select 'wOrDA wordB WoRd1 WordD wordE' from dual
  9   )
 10  ,words(n,word) as (
 11      select rownum,column_value from table(sys.odcivarchar2list('word1','word3'))
 12   )
 13  select
 14    t.s
 15    ,xt.str
 16  from t
 17      ,xmltable(
 18         'fn:replace(.,"(word1|word3)",">$1<","i")'
 19         passing t.s
 20         columns
 21           str varchar2(3000) path '.'
 22*     ) xt
SQL> /

S                                                  STR
-------------------------------------------------- --------------------------------------------------
wOrD1                                              >word1<
wOrD1 WORD2                                        >word1< WORD2
wOrD1 WORD2 WoRd3                                  >word1< WORD2 >wordord3<d1<
wOrD1 WORD2 WoRd3 Word4 Word5                      >word1< WORD2 >wordord3<d1< Word4 Word5
WoRd3                                              >word3<
wOrDA wordB WoRd1 WordD wordE                      wOrDA wordB >wordordord1< WordD wordE
...
Рейтинг: 0 / 0
06.01.2022, 22:03
    #40125037
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
лучше даже так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> ;
  1  with
  2   t(s) as (
  3      select 'wOrD1 WORD2 WoRd3 Word4 Word1' from dual
  4   )
  5  select
  6    t.s
  7    ,xt.str
  8  from t
  9      ,xmltable(
 10         'fn:replace(.,"(word)",">$1<","i")'
 11         passing t.s
 12         columns
 13           str varchar2(3000) path '.'
 14*     ) xt
SQL> /

S                                                  STR
-------------------------------------------------- ------------------------------------------------------------
wOrD1 WORD2 WoRd3 Word4 Word1                      >word<1 >word<d<2 >word<d<d<3 >word<d<d<d<4 >word<d<d<d<d<1
...
Рейтинг: 0 / 0
07.01.2022, 17:25
    #40125130
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Sayan Malakshinov,

Если предположить что бага нет. Как предлагается применить upper?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SQL> with
  2   t(s) as (
  3      select 'wOrD1' from dual union all
  4      select 'wOrD1 WORD2' from dual union all
  5      select 'wOrD1 WORD2 WoRd3' from dual union all
  6      select 'wOrD1 WORD2 WoRd3 Word4 Word5' from dual union all
  7      select 'WoRd3' from dual union all
  8      select 'wOrDA wordB WoRd1 WordD wordE' from dual
  9   )
 10  ,words(n,word) as (
 11      select rownum,column_value from table(sys.odcivarchar2list('word1','word3'))
 12   )
 13  select
 14    t.s
 15    ,xt.str
 16  from t
 17      ,xmltable(
 18         'fn:replace(., "(wOrD)", fn:upper-case(">$1<"), "i")'
 19         passing t.s
 20         columns
 21           str varchar2(3000) path '.'
 22      ) xt
 23  /

S                             STR
----------------------------- ------------------------------------------------------------
wOrD1                         >word<1
wOrD1 WORD2                   >word<1 >word<2
wOrD1 WORD2 WoRd3             >word<1 >word<2 >word<3
wOrD1 WORD2 WoRd3 Word4 Word5 >word<1 >word<2 >word<3 >word<4 >word<5
WoRd3                         >word<3
wOrDA wordB WoRd1 WordD wordE >word<A >word<B >word<1 >word<D >word<E

6 rows selected.
...
Рейтинг: 0 / 0
07.01.2022, 20:04
    #40125142
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Кобанчег,

с такими багами крайне неприятно что-то делать, но чисто для примера пара вариантов:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t(s) as (
  select 'WoRd3-xt' from dual union all
  select 'xt-WoRd3' from dual union all
  select 'WoRd2' from dual union all
  select 'WoRd1' from dual
)
select *
from t
    ,xmltable(
       'string-join(for $i in (fn:tokenize(replace($S,$REGEX,"=$1=","i"),"=")) return if (matches($i,$REGEX,"i")) then upper-case($i) else $i, "")' 
       passing t.s as S, '(word3)' as regex
       columns str varchar2(3000) path '.'
    ) xt
/


и более общий вариант:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t(s) as (
  select 'WoRd3-xt' from dual union all
  select 'xt-WoRd3' from dual union all
  select 'WoRd2' from dual union all
  select 'WoRd1' from dual
)
select *
from t
    ,xmltable(
       'declare function local:replace-word($word as xs:string, $search as xs:string*, $replace as xs:string*) as xs:string {
          if (empty($search)) then $word
          else fn:replace(local:replace-word($word, $search[position()>1], $replace[position()>1]), $search[1], $replace[1], "i")
        };
        
        let $s := $S
        let $w := fn:tokenize(fn:replace($s,$REGEX,"=$1=","i"),"=")[matches(.,$REGEX,"i")]
        let $r := (for $r in $w return upper-case($r))
        return local:replace-word($s,$w,$r)
       ' 
       passing t.s as S, '(word1|word3)' as regex
       columns str varchar2(3000) path '.'
    ) xt
/

...
Рейтинг: 0 / 0
07.01.2022, 20:27
    #40125149
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Sayan Malakshinov
Код: plsql
1.
fn:tokenize

Это понятно. Я к тому, что к найденному совпадению нельзя применить функцию так же как это нельзя сделать в regexp_replace.
...
Рейтинг: 0 / 0
07.01.2022, 21:14
    #40125158
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заменить регистр некоторых слов
Кобанчег
найденному совпадению нельзя применить функцию
применить функцию как раз можно, что и делается в более общем варианте: находятся совпадения и генерируются слова-замены и передаются уже в функцию замены, что-то типа старого пошагового appendReplacement до функциональщины Java 9. Возможности же передать ссылку на функцию, конечно, нельзя - все-таки это не функциональный язык. Жаль вообще что \U \L и условные операторы из перла в джаву не перенесли:
https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/regex/Pattern.html Comparison to Perl 5 The Pattern engine performs traditional NFA-based matching with ordered alternation as occurs in Perl 5. Perl constructs not supported by this class:
  • The backreference constructs, \g{n} for the nthcapturing group and \g{name} for named-capturing group.
  • The conditional constructs (?(condition)X) and (?(condition)X|Y),
  • The embedded code constructs (?{code}) and (??{code}),
  • The embedded comment syntax (?#comment), and
  • The preprocessing operations \l \u, \L, and \U.
  • Constructs supported by this class but not by Perl:
      Character-class union and intersection as described above.
      In Perl, \1 through \9 are always interpreted as back references; a backslash-escaped number greater than 9 is treated as a back reference if at least that many subexpressions exist, otherwise it is interpreted, if possible, as an octal escape. In this class octal escapes must always begin with a zero. In this class, \1 through \9 are always interpreted as back references, and a larger number is accepted as a back reference if at least that many subexpressions exist at that point in the regular expression, otherwise the parser will drop digits until the number is smaller or equal to the existing number of groups or it is one digit.
    Perl uses the g flag to request a match that resumes where the last match left off. This functionality is provided implicitly by the Matcher class: Repeated invocations of the find method will resume where the last match left off, unless the matcher is reset. In Perl, embedded flags at the top level of an expression affect the whole expression. In this class, embedded flags always take effect at the point at which they appear, whether they are at the top level or within a group; in the latter case, flags are restored at the end of the group just as in Perl.
    ...
    Рейтинг: 0 / 0
    08.01.2022, 00:31
        #40125185
    Кобанчег
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Заменить регистр некоторых слов
    Sayan Malakshinov
    Жаль вообще что \U \L и условные операторы из перла в джаву не перенесли
    Лично я в этом не вижу особого смысла. Достаточно что в Java можно использовать лямбда выражения в последних версиях.
    В перл тоже я бы использовал универсальное решение с модификатором /e
    Код: plaintext
    s/\b(word1|word3)\b/uc $1/egi
    ...
    Рейтинг: 0 / 0
    13.01.2022, 23:00
        #40126429
    volodin661
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Заменить регистр некоторых слов
    Кобанчег
    Sayan Malakshinov
    Жаль вообще что \U \L и условные операторы из перла в джаву не перенесли


    \U \L к регулярным выражениям не относятся,
    это перловые операторы для работы( интерполяции выражений) внутри строк с двойными кавычками.

    Код: powershell
    1.
    print "\U dog" 
    



    А perl-оператор регулярных выражений реализован так, что он подразумевает, что текст внутри него находится в двойных кавычках.
    Поэтому до разбора рег. выражения сначала проходит этап интерполяции и только потом начинается собственно разбор регулярного выражения.
    ...
    Рейтинг: 0 / 0
    14.01.2022, 04:41
        #40126465
    Sayan Malakshinov
    Модератор форума
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Заменить регистр некоторых слов
    volodin661
    это перловые операторы для работы( интерполяции выражений) внутри строк с двойными кавычками.
    ну, строго говоря, это "Escape sequences" как \r,\n,\t:
    1. "Escape sequences"
    2. perlop
    Код: plsql
    1.
    2.
    $ perl -e "print q{\lA\tA}.'===='.qq{\lB\tB\n}"
    \lA\tA====b     B
    


    volodin661
    \U \L к регулярным выражениям не относятся,
    в данном случае - при использовании в replacement, как раз относится, т.к. как раз именно они позволяют изменить регистр уже с найденными подстроками .
    volodin661
    А perl-оператор регулярных выражений реализован так, что он подразумевает, что текст внутри него находится в двойных кавычках.
    "perl-оператор регулярных выражений" вообще там не один и это зависит от :
    автор
    Код: plaintext
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    Customary  Generic        Meaning        Interpolates
        ''       q{}          Literal             no
        ""      qq{}          Literal             yes
        ``      qx{}          Command             yes*
                qw{}         Word list            no
        //       m{}       Pattern match          yes*
                qr{}          Pattern             yes*
                 s{}{}      Substitution          yes*
                tr{}{}    Transliteration         no (but see below)
                 y{}{}    Transliteration         no (but see below)
        <<EOF                 here-doc            yes*
    
        * unless the delimiter is ''.

    volodin661
    Поэтому до разбора рег. выражения сначала проходит этап интерполяции и только потом начинается собственно разбор регулярного выражения.
    речь тут шла про replacement:
    Код: plsql
    1.
    2.
    $ echo abcdef | perl -pe 's/(.)./\U\1/g'
    ACE
    

    очевидно, что интерполяция REPLACEMENT происходит после матчинга, т.к. надо подставлять backreferences. Сравни с
    Код: plsql
    1.
    2.
    3.
    4.
    5.
    $ echo abcdef | perl -pe '$r="\U\\1"; s/(.)./$r/g'
    \1\1\1
    
    $ echo abcdef | perl -pe '$r="\U\\1x"; s/(.)./\u$r/g'
    \1X\1X\1X
    
    ...
    Рейтинг: 0 / 0
    Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заменить регистр некоторых слов / 25 сообщений из 28, страница 1 из 2
    Целевая тема:
    Создать новую тему:
    Автор:
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


    Просмотр
    0 / 0
    Close
    Debug Console [Select Text]