JAVA中经常被问到的正则表达式问题

本文总结JAVA中经常被问到的正则表达式问题,正因为经常
被问到,你将发现他们也非常实用。
1:如何从字符串中提取数字
一个常见的问题是如果使用正则表达式,把字符串中的数字提取
到数组中。
在JAVA中, \d表示(0-9)范围的数字.尽量使用正则表达式可以使
代码更易阅读,同时减少错误.
预定义字符可参考:https://docs.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html
请注意\ d中的第一个反斜杠.
如果您在字符串文本中使用预定义字符(特殊字符),则必须在反斜杠之前加上另一个反斜杠,
以便转义该字符串。 这就是为什么我们需要使用\d。

List numbers = new LinkedList();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str); 
while (m.find()) {
  numbers.add(Integer.parseInt(m.group()));
}

2:如何根据换行来拆分字符串
至少有3种方法,根据不同的系统决定。
\r represents CR (Carriage Return), which is used in Unix
\n means LF (Line Feed), used in Mac OS
\r\n means CR + LF, used in Windows
最直接的方法如下:

String lines[] = String.split("\\r?\\n");

如果不想要空行,可以

String.split("[\\r\\n]+")//+号匹配多行

更健壮不依赖系统的方法如下.但如果两个空行并排放置,
仍然会得到空行。
String.split(System.getProperty("line.separator"));

3:Pattern.compile()的重要性
一个正则表达式字符串必须首先被一个Pattern实例编译。
Pattern.compile()方法是创建对象实例的唯一方法。
因此典型的调用顺序:

Pattern p = Pattern.compile("a*b");
Matcher matcher = p.matcher("aaaaab");
assert matcher.matches() == true;

从本质上讲,Pattern.compile()用于将正则表达式转换为有限状态机.
并保存在匹配器中,通过这种方式,Pattern p可以种,不同的匹配可以
共享相同的模式。

Matcher anotherMatcher = p.matcher("aab");
assert anotherMatcher.matches() == true;
Pattern.matches()方法只使用一次正则表达式.该方法仍然通过
oolean b = Pattern.matches("a*b", "aaaaab");
compile()隐式地获取Pattern的实例,并匹配一个字符串
因此对于重复的匹配,效率较低,因为它不允许重复使用编译的模式。

4.如何避免正则表达式的文本?
一般来说,正则表达式使用“\”来转义结构,
但是在反斜杠之前加上另一个反斜线以便Java字符串编译是很痛苦的。
用户还可以通过另一种方式将字符串文字传递给Pattern,例如“ 5或5");

5.为什么String.split()为什么分隔符才能被转义?
String.split()将字符串按匹配的正则表达式分割。
Java表达式支持影响模式匹配方式的特殊字符,称为元字符。| 是一个元字符,
用于匹配几个可能的正则表达式中的单个正则表达式。
例如,A | B表示A或B。
更多可参考:
http://www.regular-expressions.info/alternation.html
因此,要使用|作为字符,您需要通过在之前添加\来转义,例如\|。

7:如果用单个空格替换2个及以上的空格,及删除最前面空格?
String.replaceAll()替换满足正则表达式匹配的每个子串。
“2个或更多空格”可以用正则表达式[]+表示。
因此,下面的代码将起作用。
请注意,该解决方案最终不会删除所有前导和尾随空格。
如果你想删除它们,你可以在管道中使用String.trim()。
String line = " aa bbbbb ccc d ";
// " aa bbbbb ccc d "
System.out.println(line.replaceAll("[\s]+", " "));

8:如判断一个素数
请参考原文
9:如何用分隔符分割一个字符串,并忽略逗号。
你已经理解了正则表达式分割符了,可以编写一个
工具类,来根据需要处理一些特殊情况。
您可以使用switch语句或if-else来实现,例如:

public static void main(String[] args) {
  String line = "aaa,bbb,\"c,c\",dd;dd,\"e,e";
  List toks = splitComma(line);
  for (String t : toks) {
    System.out.println("> " + t);
  }
}

private static List splitComma(String str) {
  int start = 0;
  List toks = new ArrayList();
  boolean withinQuote = false;
  for (int end = 0; end < str.length(); end++) {
    char c = str.charAt(end);
    switch(c) {
    case ',':
      if (!withinQuote) {
        toks.add(str.substring(start, end));
        start = end + 1;
      }
      break;
    case '\"':
      withinQuote = !withinQuote;
      break;
    }
  }
  if (start < str.length()) {
    toks.add(str.substring(start));
  }
  return toks;
}

10:java正则表达式中的反向引用。

https://www.programcreek.com/2013/08/backreferences-in-java-regular-expressions/

原文:

https://www.programcreek.com/2013/10/top-10-questions-for-java-regular-expression/

欢迎关注公众号:

image
image.gif

你可能感兴趣的:(JAVA中经常被问到的正则表达式问题)