Що я розумію, це те, що для кожного зворотного косого кута потрібен ще один зворотний нахил, щоб уникнути регулярного вираження. У мене є такий вхідний рядок на Java:
C:\my\drive\application\webapps\ROOT\classes\there\is\a\clazz
щоб видалити все до верху classes\
, Я додав наступний регулярний вираз у Java replaceAll()
спосіб:
.*\\b(classes)(\\W\\S|\\/){1,2}\\b
Чому я додав чотири косої риски
Один зворотний косий рятунок врятувався, щоб вказати, що це регулярний вираз
\
Один зворотний косий рядок втік, який вказує на те, що введення регулярного виразу відбувається як 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, він уникає символу втечі і показує подвійний
\
. Якщо ви перевірите його символів, є лише один ""
між кожними двома компонентами шляху.