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


Я вижу два варианта решения:
1. Нужно использовать для таких целей функцию.
2. Разбивать строку на три части (до слова, слово, после слова) и для средней части менять регистр.
Может будут еще идеи как это проще сделать?
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #40124645
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

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

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

ЗЫ
Уважаемый, для того чтобы сделать ссылку на произведение Льва Толстого "Война и мир" совсем не обязательно приводить его полный текст. Достаточно сделать ссылку и, желательно, на конкретную фразу, которая Вам непонятна или не нравиться.
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #40124655
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или еще пример
Строка входная 'Текст1 Кст-Текст2'
Слово поиска 'кст'
Строка на выходе 'Текст1 КСТ-Текст2'
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #40124689
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Уважаемый
Совковец, не следует огрызаться, прося помощи.
Функция, раскладывающая предложение в слова, преобразующая и далее собирающая предложение.
RE тут только как помощник в разложении на слова.
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #40124699
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
Функция, раскладывающая предложение в слова, преобразующая и далее собирающая предложение.
RE тут только как помощник в разложении на слова.

Спасибо!
Уже понял, что других вариантов, по сути нет, - сделал функцию.
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #40124700
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
Совковец, не следует огрызаться, прося помощи.
Даже давая ответы, не стоит вешать ярлыки. Я из СССР, но не "Совковец".
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #40124704
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
не стоит вешать ярлыки. Я из СССР, но не
Ты сам на себя навесил ярлык этого чудовищного образования.
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #40124706
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
оракловые и java регулярки к сожалению не поддерживают перловые модификаторы \U \L
Но java, к счастью, позволяет применить произвольную функцию к найденному слову. В отличие от Oracle.
В Java 9 (которая пока недоступна в Oracle DB) это вообще сделали по человечески наконец-то.
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #40124988
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег,

Спасибо! Не знал о такой возможности.
Интересное решение, но, к сожалению, у меня нет соответствующих прав.
Сейчас это уже не важно. Написал обычную функции Oracle и она работает достаточно быстро.
Еще раз спасибо, буду знать о такой возможности на будущее.
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #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
Заменить регистр некоторых слов
    #40125149
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
Код: plsql
1.
fn:tokenize

Это понятно. Я к тому, что к найденному совпадению нельзя применить функцию так же как это нельзя сделать в regexp_replace.
...
Рейтинг: 0 / 0
Заменить регистр некоторых слов
    #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
    Заменить регистр некоторых слов
        #40125185
    Фотография Кобанчег
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Sayan Malakshinov
    Жаль вообще что \U \L и условные операторы из перла в джаву не перенесли
    Лично я в этом не вижу особого смысла. Достаточно что в Java можно использовать лямбда выражения в последних версиях.
    В перл тоже я бы использовал универсальное решение с модификатором /e
    Код: plaintext
    s/\b(word1|word3)\b/uc $1/egi
    ...
    Рейтинг: 0 / 0
    Заменить регистр некоторых слов
        #40126429
    Фотография volodin661
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Участник
    Кобанчег
    Sayan Malakshinov
    Жаль вообще что \U \L и условные операторы из перла в джаву не перенесли


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

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



    А perl-оператор регулярных выражений реализован так, что он подразумевает, что текст внутри него находится в двойных кавычках.
    Поэтому до разбора рег. выражения сначала проходит этап интерполяции и только потом начинается собственно разбор регулярного выражения.
    ...
    Рейтинг: 0 / 0
    Заменить регистр некоторых слов
        #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
    25 сообщений из 28, страница 1 из 2
    Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заменить регистр некоторых слов
    Целевая тема:
    Создать новую тему:
    Автор:
    Закрыть
    Цитировать
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


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