|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Этот раздел описывает некоторые дополнительные полезные методы Matcher class. Для удобства упомянутые ниже методы группируются согласно функциональности.
Индексируйте методы, обеспечивают полезный, индексируют значения, которые показывают точно, где соответствие было найдено в строке ввода:
public int start(): Возвращается запуск индексируют предыдущего соответствия.Методы исследования рассматривают строку ввода и возвращают булево указание, находится ли образец.
Заменяющие методы являются полезными методами для того, чтобы заменить текст в строке ввода.
String для указанного String. Этот метод производит a String это будет работать литеральной заменой s в appendReplacement метод Matcher class. String произведенный будет соответствовать последовательность символов в s обработанный как литеральная последовательность. Наклонные черты ('\') и знаки доллара ('$') не будет дан особого значения.start и end МетодыВот пример,
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatcherDemo {
private static final String REGEX =
"\\bdog\\b";
private static final String INPUT =
"dog dog dog doggie dogg";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "
+ count);
System.out.println("start(): "
+ m.start());
System.out.println("end(): "
+ m.end());
}
}
}
OUTPUT: Match number 1 start(): 0 end(): 3 Match number 2 start(): 4 end(): 7 Match number 3 start(): 8 end(): 11
Можно видеть, что этот пример использует границы слова, чтобы гарантировать что буквы "d" "o" "g" не просто подстрока в более длительном слове. Это также дает немного полезной информации о том, где в строке ввода соответствие произошло. start метод возвращается, запуск индексируют подпоследовательности, полученной данной группой во время предыдущей работы соответствия, и end возвращает индексирование соответствующего последнего знака, плюс один.
matches и lookingAt Методы matches и lookingAt методы обе попытки соответствовать входную последовательность против образца. Различие, однако, является этим matches требует, чтобы вся входная последовательность была соответствующей, в то время как lookingAt не делает. Оба метода всегда запускаются в начале строки ввода. Вот полный код, MatchesLooking.java:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatchesLooking {
private static final String REGEX = "foo";
private static final String INPUT =
"fooooooooooooooooo";
private static Pattern pattern;
private static Matcher matcher;
public static void main(String[] args) {
// Initialize
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println("Current REGEX is: "
+ REGEX);
System.out.println("Current INPUT is: "
+ INPUT);
System.out.println("lookingAt(): "
+ matcher.lookingAt());
System.out.println("matches(): "
+ matcher.matches());
}
}
Current REGEX is: foo Current INPUT is: fooooooooooooooooo lookingAt(): true matches(): false
replaceFirst(String) и replaceAll(String) replaceFirst и replaceAll методы заменяют текст, который соответствует данное регулярное выражение. Поскольку их имена указывают, replaceFirst заменяет первое возникновение, и replaceAll замены все происшествия. Вот ReplaceDemo.java код:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceDemo {
private static String REGEX = "dog";
private static String INPUT =
"The dog says meow. All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
OUTPUT: The cat says meow. All cats say meow.
В этой первой версии, всех возникновениях dog заменяются cat. Но почему остановка здесь? Вместо того, чтобы заменять простой литерал как dog, можно заменить текст, который соответствует любое регулярное выражение. API для этого метода утверждает что "данный регулярное выражение a*b, ввод aabfooaabfooabfoob, и заменяющая строка -, вызов этого метода на matcher для того выражения привел бы к строке -foo-foo-foo-."
Вот ReplaceDemo2.java код:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceDemo2 {
private static String REGEX = "a*b";
private static String INPUT =
"aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// get a matcher object
Matcher m = p.matcher(INPUT);
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
OUTPUT: -foo-foo-foo-
Чтобы заменить только первое возникновение образца, просто вызовите replaceFirst вместо replaceAll. Это принимает тот же самый параметр.
appendReplacement(StringBuffer,String) и appendTail(StringBuffer) Matcher class также обеспечивает appendReplacement и appendTail методы для текстовой замены. Следующий пример, RegexDemo.java, использование эти два метода, чтобы достигнуть того же самого эффекта как replaceAll.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexDemo {
private static String REGEX = "a*b";
private static String INPUT = "aabfooaabfooabfoob";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
OUTPUT: -foo-foo-foo-
java.lang.StringДля удобства, String class подражает нескольким Matcher методы также:
public String replaceFirst(String regex, String replacement): Заменяет первую подстроку этой строки, которая соответствует данное регулярное выражение с данной заменой. Вызов этого метода формы str.replaceFirst(regex, repl) урожаи точно тот же самый результат как выражение Pattern.compile(regex).matcher(str).replaceFirst(repl)str.replaceAll(regex, repl) урожаи точно тот же самый результат как выражение Pattern.compile(regex).matcher(str).replaceAll(repl)