/ / Чи дійсно Java Escape Back Slashes як це стверджує? - java, регекс

Чи дійсно Java виключає зворотний зв'язок, як це вимагає? - java, regex

Що я розумію, це те, що для кожного зворотного косого кута потрібен ще один зворотний нахил, щоб уникнути регулярного вираження. У мене є такий вхідний рядок на Java:

C:\my\drive\application\webapps\ROOT\classes\there\is\a\clazz

щоб видалити все до верху classes\, Я додав наступний регулярний вираз у Java replaceAll() спосіб:

.*\\b(classes)(\\W\\S|\\/){1,2}\\b

Чому я додав чотири косої риски

  1. Один зворотний косий рятунок врятувався, щоб вказати, що це регулярний вираз \

  2. Один зворотний косий рядок втік, який вказує на те, що введення регулярного виразу відбувається як Java-рядок \.

Але навіть з одним набором подвійного нахилу \ це не працює.

Коли я спробував це на regexr та regexplanet, здається, що він працює правильно як для unix / windows типу файлових маршрутів, так і дав мені те, що я хотів. Це показало мені правильно replaceAll() результати за бажанням.

Але коли я вкладаю його в код, він взагалі не працює.

Фактичний код

String targetStr = someMethod.get(); // value is C:\my\drive\application\webapps\ROOT\classes\there\is\a\clazz

String replacedVal = targetStr.replaceAll(".*\\b(classes)(\\W\\S|\\/){1,2}\\b", "");

System.out.println(targetStr);
System.out.println(replacedVal); // same as targetStr i.e. nothing has been replaced

Отже, скільки разів нам у Java потрібно насправді уникнути кожної косої риски, щоб змусити це працювати?

Відповіді:

2 для відповіді № 1

У випадках з рядками та епізодами ви повинні дійсно показати свій фактичний код, MCVE, ні пояснити свій код. Спеціальний знак у регулярному вираженні: один зворотний нахил, фактичний зворотний косий кут у регулярному вираженні: два зворотні косої риси, два фактичні косої косої риси в регексі: чотири нахили. Regex у рядку java: подвійно всі відступи.

Таким чином, один прямолінійний кут нахилу означає два косих косих рисочків, щоб представити його у рядку, тобто 4 косих косих рисочків для репрезентації в рядку регулярних виразів. Всі "регулярні" спеціальні символи регулярного вираження люблять w також потрібні два нахили в нижній частині Java String -> "\w".

Схоже, у вас точно вдвічі більша кількість ви повинні мати в регулярному вираженні. Тільки якщо у вас є рядок регулярних виразів і хочете відповідати буквальному чотири зворотні косої риски правильні.


Примітка щодо вашого коду: ви пишете:

String targetStr = someMethod.get(); // value is C:\my\drive\application\webapps\ROOT\classes\there\is\a\clazz

Але це не зовсім правильно, значення є

C:mydriveapplicationwebappsROOTclassesthereisaclazz

Тільки тому, що ваш IDE відображає його як String, він уникає символу втечі і показує подвійний \. Якщо ви перевірите його символів, є лише один "" між кожними двома компонентами шляху.