实现正则表达式的*和.
主要考察点:
*表示匹配前面的子表达式零次或多次。要匹配 *字符,则需要使用\*
.匹配除换行符 \n 之外的任何单字符。要匹配 .字符 ,则需要使用 \.
思路
一个一个的进行匹配,如果不满足规则,则退出循环,返回false,否则循环结束后,返回true
/*
说明
* 匹配前面的子表达式零次或多次。要匹配 * 字符,使用 \*
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,使用 \. 。
*/
public class Solution
{
public boolean isMatch(String s,String p)
{
for(int ids=0,idp=0;idp<p.length();)
{
try
{
if(p.charAt(idp)=='\\') //碰到了转义字符'\',考虑是要匹配字符'*',还是'.'
{
idp+=1;
if(p.charAt(idp)=='*')
{
if(s.charAt(ids)=='*')
{
ids+=1;
idp+=1;
}
else
return false;
}
else if(p.charAt(idp)=='.')
{
if(s.charAt(ids)=='.')
{
ids+=1;
idp+=1;
}
else
return false;
}
else
return false;
}
if(p.charAt(idp+1)=='*') //*的前面一个字符可以匹配一切
{
ids=s.indexOf(p.charAt(idp+2));
idp=idp+2;
}
}catch(StringIndexOutOfBoundsException e)
{//说明p到尾部了
}
try {
if(p.charAt(idp)=='.'||s.charAt(ids)==p.charAt(idp)) //.只能匹配一个
{
idp=idp+1;
ids=ids+1;
}
else
{
return false;
}
}
catch(StringIndexOutOfBoundsException e)
{
return false;
}
}
return true;
}
public static void main(String[] args)
{
String s="a*cdfg";
String p="a\\*c.f";
Solution ss=new Solution();
System.out.print(ss.isMatch(s, p));
}
}
表示数值的字符串
数字有两种表示形式:
- 科学计数法
- 阿拉伯这种
科学计数法要求
- e的前面是1到10之间的浮点数(正数可以带+也可以不带),包括1,不包括10
- e的后面必须是整数(正数可以带+也可以不带)
- e可以小写也可以大写
思路
分两种形式判断,且利用java的String转为数字的方法,如果报错,说明不是数值形式的字符串
public class Solution {
public boolean isNumber(String s)
{
s=s.toLowerCase();
if(s.indexOf('e')!=-1) //说明是利用e进行的科学计数法的形式
{
String[] str=s.split("e");
try
{
double pre=Double.parseDouble(str[0]);
double end=Integer.parseInt(str[1]);
if(pre<=-10.0||pre>10.0)
return false;
}
catch(NumberFormatException e)
{
return false;
}
}
else
{
try
{
double number=Double.parseDouble(s);
}
catch(NumberFormatException e)
{
return false;
}
}
return true;
}
public static void main(String[] args)
{
Solution ss=new Solution();
System.out.print(ss.isNumber("-1E-16"));
}
}