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

   本文总结JAVA中经常被问到的正则表达式问题,正因为经常
被问到,你将发现他们也非常实用。
1:如何从字符串中提取数字
 一个常见的问题是如果使用正则表达式,把字符串中的数字提取
到数组中。
 在JAVA中, \d表示(0-9)范围的数字.尽量使用正则表达式可以使
代码更易阅读,同时减少错误.
预定义字符可参考:https://docs.oracle.com/javase/tutorial/essential/regex/pre_char_classes.html
请注意\ d中的第一个反斜杠\.
如果您在字符串文本中使用预定义字符(特殊字符),则必须在反斜杠之前加上另一个反斜杠,
以便转义该字符串。 这就是为什么我们需要使用\\d。
List<Integer> numbers = new LinkedList<Integer>();
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],我们可以输入
Pattern.quote("$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<String> toks = splitComma(line);
  for (String t : toks) {
    System.out.println("> " + t);
  }
}
 
private static List<String> splitComma(String str) {
  int start = 0;
  List<String> toks = new ArrayList<String>();
  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/

欢迎关注公众号:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值