最近学了正则表达式,发现在解与字符串相关的题目是有事半功倍的效果。
今天这道题来源与牛客网剑指Offer
题目:
/**
- 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只 出现一次的字符,
- 并返回它的位置, 如果没有则返回 -1(需要区分大小写).
- @author 橙子
*/
这道题我利用了java正则表达式的Pattern与matcher。下面我先简要介绍一下他们。java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test13 {
public static int FirstNotRepeatingChar(String str) {
for(int i=0;i<str.length();i++) {
String ss=String.valueOf(str.charAt(i));
Pattern p=Pattern.compile(ss);//将规则字符串解析为一个Pattern对象这里规则是ss为单个字符
Matcher m=p.matcher(str);//m里就封装了这个字符串按照规则的模式对象也为单个字符
int count=0;
while(m.find()) {
count++;
if(count>1) {
break;
}
}
if(count==1) {
return str.indexOf(ss);
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(FirstNotRepeatingChar("gogole"));
}
}
首先Pattern.complie(String regex)简单工厂方法创建一个正则表达式。我传进去的是一个单个字符的字符串规则。所以matcher类的m对象的matcher()方法对整个字符串进行匹配,只有整个字符串都匹配了才返回true m里就封装了这个字符串按照规则的模式对象也为单个字符 m.find()方法
表示寻找按规则匹配的字符串。因为题目要求只要出现一次的所以用for一次一次遍历