print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))
печатает:
01
10
100
$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 , которые говорят:
Брекетинговая конструкция
blockquote>(\ ...\ )
также может быть использована, в этом случае\<digit>
соответствует подстрокеdigit
'th. (Вне рисунка всегда используйте$
вместо\
перед цифрой. Область действия$<digit>
(и$\`
,$&
и$'
) продолжается до конца прилагаемого блока или eval string, или к следующему шаблону, совпадающему с подвыражениями. Нотация\<digit>
иногда работает вне текущего шаблона, но на него не следует полагаться.) У вас может быть столько скобок, сколько пожелаете. Если у вас более 9 подстрок, переменные$10
,$11
, ... относятся к соответствующей подстроке. Внутри шаблона\10
,\11
и т. Д. Ссылаются на подстроки, если до обратной ссылки было по крайней мере столько левых парен. В противном случае (для обратной совместимости)\10
совпадает с\010
, backspace и\11
совпадает с\011
, вкладкой. И так далее. (\1
через\9
всегда обратные ссылки.)
Я думаю, что главная проблема - это не обратная связь, которая отлично работает с \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 :-(");
}
}
}