请解释一下正则的相关内容呢
2021-09-06 来源:临清租房网
请解释一下正则的相关内容
2:不以某某开头 ,比如不以www开头
Java codepublic class Test {
public static void main(String[] args) {
String[] strs = {
\"abc1232\", \"wwwadsf\",
\"awwwfas\", \"wwadfsf\",
\"\", \"ww\", \" \", \"www\"
};
String regex = \"(?:(?!^www).)*\";
for(String str : strs) {
intf(\"%-7s %s%n\", str, tches(regex));
}
}
}
(?!X) 专业名称为 Negative Lookahead,表示字符间缝隙后面不允许出现的字符,
即匹配字符间的缝隙,如果缝隙后的字符不是 X 的话,那这个缝隙就匹配成功。
举个例子,aab 和 aac,现有表达式 aa(?!b) 这时我们能匹配到的字符串是 aac,
因为 aa 的后面的缝隙之后不允许出现字符 b,因此只有 aac 进行了匹配。
再来看个示例:
Java codepublic class Test {
public static void main(String[] args) {
String str = \"AQuickBrownFoxJumpsOverTheLazyDog\";
String[] strs = lit(\"(?!^)(?=[A-Z])\");
for(String s : strs) {
intln(s);
}
}
}
根据大写字母拆分字符串。当然了,这个使用字符串进行分析同样也能进行拆分,
但是使用正则表达式来拆的话更为便捷直观一些。
在进行这种拆分时,由于在拆分后的字符数不能减少,因此只能使用零宽度的
lookaround 功能进行匹配,lookaround 包括四个,即:
Java code(?=X) (?!X) (?=X) (?!X)
来看一下这个表达式:(? !^)(?=[A-Z])
前面说到过 (?!) 表示缝隙后面不允许出现的东西,而 (? !) 表示缝隙前不允许出现的东西。
(?=) 表示缝隙后允许出现的东西,(? =) 表示缝隙前允许出现的东西。
这个表达式在拆分时,根据零宽度匹配缝隙进行拆分的,这个缝隙必须满足以下条件:
(? !^) 表示缝隙不允许前不能是行开始,即缝隙不能出现在首字母的前面。
(?=[A-Z]) 表示缝隙后面允许出现 A-Z 的大写字母。
这时这个表达式就匹配了下面带有 | 的缝隙:
Java code
A|Quick|Brown|Fox|Jumps|Over|The|Lazy|Dog
PS:不加 (?!^) 的话,会变成:
A|Quick|Brown|Fox|Jumps|Over|The|Lazy|Dog
根据 split 的功能,正则表达式处理程序就根据上面的 | 将字符串给拆分开来了。
3,不区分大小写
不加任何限制的匹配是匹配分大小写的,但是正则表达式中可以进行改变,
有两种方式:参数式和内嵌式。
来看个示例:
Java codeimport tcher;
import ttern;
public class Test {
public static void main(String[] args) {
String str = \"Book\";
Pattern pattern = pile(\"book\");
Matcher matcher = tcher(str);
intln(tches());
}
}
上面的这个表达式 book 是不能匹配字符串 Book 的,这时我们只要给定编译时的参数就可以了:
Pattern pattern = pile(\"book\", SE_INSENSITIVE);
SE_INSENSITIVE 这是一个 int 类型的常量,值为 2。表示表达式忽略大小写进行区配。
两会披露出新东方可能与阿里腾讯合作后 如果我们不采用 Pattern 和 Matcher 两个类来匹配的话,只是使用 String 的 matches 方法的话,
我们就不能指定表达式的编译参数了,这时就需要采用内嵌标志表达式了,与 SE_INSENSITIVE
对应的内嵌标志表达式是 (?i),它有四种形式:
1,(?i)
2,(?-i)
3,(?i:X)
4,(?-i:X)
不带有 - 的是开标志,带有 - 的是关标志。
把上面的代码改成这样:
Java codepublic class Test {
public static void main(String[] args) {
String str = \"Book\";
String regex = \"(?i)book\";
intln(tches(regex));
}
}
我们就达到了同样的效果,当然这样并不是最好的,因为字符串中只有 B 是大写的,
我们没有必要把所有的字符都进行不区分大小写匹配,我们可以在打开标志,用 (?i) 的
第二种形式马上关掉它:
String regex = \"(?i)b(?-i)ook\";
这样的话,只有 b 是区分大小写了,而 (?-i) 后面的还是得区分大小写匹配的。这样写
可能看上去很不顺眼,我们还能使用第 3 种形式直接指定某些字符是不区分大小写的。
String regex = \"(?i:b)ook\";
这样的表达式与上面的那个在语义上是相同的。就效率上肯定是优于一下子开,一下子关的。
可见内嵌标志表达式要比指定编译参数的功能强大许多。
使用建议:如果能确定某些字符的大小写时,尽量使用已确定的字符,对于不确定的可以采用
(?i:X) 的方式指定。因此打开不区分大小写开关时,对匹配的性能是有一定影响的。
思考一下:String regex = \"(?i)b(?-i:oo)k\"; 这个表达式的意思?
榆林白癜风治疗郑州治疗白癜风多少钱
类风湿关节炎患者疼痛如何缓解
-
- 上一篇
- 请网友警惕借募捐骗钱发国难财者牛
-
- 下一篇
- 请远离廉价手机的