String для HTML-абзацев на Java с Regex [duplicate]

print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

печатает:

01
10
100
1
задан Jaumzera 9 June 2016 в 19:38
поделиться

2 ответа

$1 не является обратной ссылкой в ​​регулярных выражениях Java, ни в любом другом вкусе, о котором я могу думать. Вы используете только $1, когда вы заменяете что-то:

String input="A12.3 bla bla my input";
input = StringUtils.replacePattern(
            input, "^([A-Z]\\d{2}\\.\\d).*$", "$1");
//                                            ^^^^

Существует некоторая дезинформация о том, что такое обратная ссылка, включая то место, которое я получил от этого фрагмента: простое java regex с backreference не работает .


Java смоделировал свой синтаксис regex после других существующих ароматов, где $ уже был метасимволом. Он привязывается к концу строки (или линии в многострочном режиме).

Аналогичным образом, Java использует \1 для обратных ссылок. Поскольку регулярные выражения являются строками, они должны быть экранированы: \\1.

С лексической / синтаксической точки зрения верно, что $1 можно было использовать однозначно (в качестве бонуса это предотвратило бы необходимость " зло избегало побега "при использовании обратных ссылок).

Чтобы соответствовать 1, который приходит после конца строки, регулярное выражение должно быть $\n1:

this line
1

Просто имеет смысл использовать знакомый синтаксис вместо изменения правил, большинство из которых пришло из Perl.

Первая версия Perl появилась в 1987 , которая намного раньше Java, которая была выпущена в [ 1995]

Я выкопал страницы man для Perl 1 , которые говорят:

Брекетинговая конструкция (\ ...\ ) также может быть использована, в этом случае \<digit> соответствует подстроке digit 'th. (Вне рисунка всегда используйте $ вместо \ перед цифрой. Область действия $<digit>$\`, $& и $') продолжается до конца прилагаемого блока или eval string, или к следующему шаблону, совпадающему с подвыражениями. Нотация \<digit> иногда работает вне текущего шаблона, но на него не следует полагаться.) У вас может быть столько скобок, сколько пожелаете. Если у вас более 9 подстрок, переменные $10, $11, ... относятся к соответствующей подстроке. Внутри шаблона \10, \11 и т. Д. Ссылаются на подстроки, если до обратной ссылки было по крайней мере столько левых парен. В противном случае (для обратной совместимости) \10 совпадает с \010, backspace и \11 совпадает с \011, вкладкой. И так далее. (\1 через \9 всегда обратные ссылки.)

4
ответ дан Community 23 August 2018 в 02:16
поделиться

Я думаю, что главная проблема - это не обратная связь, которая отлично работает с \1 в java.

Ваша проблема скорее всего «обтекание» шаблона регулярного выражения в Java.

Если вы хотите, чтобы шаблон

(\d)\1{14}

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

(\\d)\\1{14}

Voila работает как шарм: goo.gl/BNCx7B (добавьте http: //, SO не разрешает Url-Shorteners, но у tutorialspoint.com нет другого выбора, как кажется)

Offline-Example:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HelloWorld{

     public static void main(String []args){
        String test = "555555555555555"; // 5 followed by 5 for 14 times.

        String pattern = "(\\d)\\1{14}";

        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(test);
        if (m.find( )) {
           System.out.println("Matched!");   
        }else{
           System.out.println("not matched :-(");    
        }
     }
}
3
ответ дан dognose 23 August 2018 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: