Страницы: 1
RSS
Ошибка в регулярном выражении?
 
В столбце 5.1 хочу заменить последние символы (_\d{2}) на пустой символ (" "), если перед ними не идет _сырный_и_для_гриля. Для этого использую функцию:

let   fx=(txt as text, regex as text)=>
   Web.Page(
       "<script>
           var x = '" & txt & "';
           var pattern = /" & regex & "/gi;
           var result = x.replace(pattern,'');
           document.write(result);
       </script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}

in
fx

Я уверена, что ошибка именно в синтаксисе регулярного выражения, потому что без ретроспективной проверки (?<!_сырный_и_для_гриля), функция выдает результат.
Изменено: Юрий М - 29.04.2022 14:53:39
 
Светлана Клешнева, JavaScript вообще не знаю.
Но совет: 2 дня назад помогал ускорить обработку данных для PBI. С регулярками (получение даты из текста) обновление более 5 минут. С самописной функцией на M - 10 сек. Так что нафиг эти регулярки :)
Изменено: surkenny - 29.04.2022 09:30:37
 
Ан нет. Сделала проверку регулярки на сайте jsbin. Регулярка работает. Тогда совсем не понимаю ошибку (см Снимок1.JPG). Подскажите, плиз! Целый день мучаюсь.
 
Светлана Клешнева, здравствуйте!
Можно использовать такую:
Код
^(((?!сырный_и_для_гриля).)*)(_\d{2})$
см. файл (на Java тоже должно работать)
Изменено: artemkau88 - 30.04.2022 09:43:07
 
Светлана Клешнева,  не слушаете Вы советов... Ну не сложная же функция для Вашей задачи, а работать будет гООООраздо быстрее:
Код
( text as text, condition as text ) as text =>
  let
    textBeforeDelim = Text.BeforeDelimiter ( text, "_", { 0, RelativePosition.FromEnd } ), 
    textAfterDelim = Text.AfterDelimiter ( text, "_", { 0, RelativePosition.FromEnd } ), 
    conditionForReplace = Text.Length ( textAfterDelim ) = 2 
      and Text.Remove ( textAfterDelim, { "0" .. "9" } ) = "" 
      and not Text.EndsWith ( textBeforeDelim, condition ), 
    result = if conditionForReplace then textBeforeDelim else text
  in
    result

Пример:
Код
let
  table = Table.FromColumns (
    { { "fff_сырный_и_для_гриля_02", "fgggg_аоаоао_03", "fgggg_аоаоао", "fgggg_аоаоао_005" } },
    type table [ text = text ]
  ),
  replace = Table.AddColumn ( table, "new text", each f_replaceEndText ( [text], "сырный_и_для_гриля" ), type text )
in
  replace
Изменено: surkenny - 29.04.2022 14:51:38
 
Светлана Клешнева,  Ваши файлы удалил - ознакомьтесь с правилами. И на форуме по Excel нужно не картинки показывать, а XL-файлы.
И код следует оформлять соответствующим тегом. Ищите кнопку <...>
 
nilske, можно так:
Код
let
  f_CaseSubstitution = ( text as text ) as text =>
    [
      lowerLetters = { "а" .. "я", "ё" },
      capitalLetters = { "А" .. "Я", "Ё" },
      replaceRec = Record.FromList ( lowerLetters & capitalLetters, capitalLetters & lowerLetters ),
      replace = List.Accumulate (
        Text.ToList ( text ),
        "",
        ( s, c ) => s & Record.FieldOrDefault ( replaceRec, c, c )
      )
    ][replace],

  example = f_CaseSubstitution ( "а КАК ЗАМЕНИТЬ БОЛЬШИЕ БУКВЫ НА МАЛЕНЬКИЕ? и НАОБОРОТ? ))" )
in
  example
 
surkenny,  Спасибо большое, сработало ))
 
surkenny, дело в том, что я не знаю язык М, еще не изучала этот язык настолько, что б самостоятельно функции создавать. А результат нужен сейчас. За помощь большое спасибо!
Страницы: 1
Наверх