js正则表达式小节

字符类是用于测试的字符的组合,通过将一些字符放入方括号中,可以很有效的告诉正则表达式去匹配第一个字符、第二个字符、第三个字符等等。
1、简单类,比如,想匹配“bat","cat", "fat"
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var x; 
  3. var sToMatch = "a bat, a bcat, a Fat baT, a faT cat"
  4. var reBatCatRat = /[bcf]at/gi; 
  5. var arrMatches = sToMatch.match(reBatCatRat); 
  6. document.write(sToMatch+"</br>"); 
  7. for(x in arrMatches){ 
  8. document.write(arrMatches[x] + "</br/>"); 
  9. </script> 
<script type="text/javascript">
var x;
var sToMatch = "a bat, a bcat, a Fat baT, a faT cat";
var reBatCatRat = /[bcf]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
document.write(sToMatch+"</br>");
for(x in arrMatches){
document.write(arrMatches[x] + "</br/>");
}
</script>
2、负向类,除了特定的字符,可能会想匹配所有的字符,负向类可以指定要排除的字符,脱字符号(^)告诉正则表达式字符不能匹配后面跟着的字符,例如,只想获取包含at但不能以b或c开头的单
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var x; 
  3. var sToMatch = "a bat, a cat, a Fat haT, a faT cat"
  4. var reBatCatRat = /[^bc]at/gi; 
  5. var arrMatches = sToMatch.match(reBatCatRat); 
  6. document.write(sToMatch+"</br>"); 
  7. for(x in arrMatches){ 
  8. document.write(arrMatches[x] + "</br/>"); 
  9. </script> 
<script type="text/javascript">
var x;
var sToMatch = "a bat, a cat, a Fat haT, a faT cat";
var reBatCatRat = /[^bc]at/gi;
var arrMatches = sToMatch.match(reBatCatRat);
document.write(sToMatch+"</br>");
for(x in arrMatches){
document.write(arrMatches[x] + "</br/>");
}
</script>
3、范围类,假设要匹配所有的字母表中的字符,但又不想逐个输入,可以使用范围类。指定从a到z的范围[a-z],”-"是从什么到什么的意思,这里仅仅匹配小写字母
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var x; 
  3. var sToMatch = "num1, num2, num3, num4, num5, num6, num7"
  4. var reOneToFour = /num[1-4]/gi; 
  5. var arrMatches = sToMatch.match(reOneToFour); 
  6. document.write(sToMatch+"</br>"); 
  7. for(x in arrMatches){ 
  8. document.write(arrMatches[x] + "</br/>"); 
  9. </script> 
<script type="text/javascript">
var x;
var sToMatch = "num1, num2, num3, num4, num5, num6, num7";
var reOneToFour = /num[1-4]/gi;
var arrMatches = sToMatch.match(reOneToFour);
document.write(sToMatch+"</br>");
for(x in arrMatches){
document.write(arrMatches[x] + "</br/>");
}
</script>
4、组合类,是由几种其他的类组合而成的字符类。例如要匹配所有从a~m的字母,以及从1~4的数字,以及一个换行符,那么要用到的类应该是这样的[a-m1-4\m],注意内部类之间不要有空格,
javascript不支持某些其他正则表达式实现中的联合类和交叉类。这意味着不能有类似[a-m[p-z]]或者[a-m[^b-e]]之类的模式出现
5、预定义类,

代码

等同于

匹配

.

[^\n\r]

除了换行和回车以外的任意字符

\d

[0-9]

数字

\D

[^0-9]

非数字字符

\s

[ \t\n\x0B\f\r]

空白字符

\S

[^ \t\r\n\x0B\f]

非空白字符

\w

[a-zA-Z_0-9]

单词字符(所有的字母、所有的数字、下划线)

\W

[^a-zA-Z_0-9]

非单词字符

例如,想匹配三格数字:
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var x; 
  3. var sToMatch = "567 9838 abc"
  4. var reThreeNums = /[0-9][0-9][0-9]/; 
  5. var arrMatches = sToMatch.match(reThreeNums); 
  6. //alert(arrMatches.length); 
  7. for(x in arrMatches){ 
  8. document.write(arrMatches[x] + "</br/>"); 
  9. </script> 
<script type="text/javascript">
var x;
var sToMatch = "567 9838 abc";
var reThreeNums = /[0-9][0-9][0-9]/;
var arrMatches = sToMatch.match(reThreeNums);
//alert(arrMatches.length);
for(x in arrMatches){
document.write(arrMatches[x] + "</br/>");
}
</script>

量词:可以指定某个特定模式出现的次数。
1、简单量词

代码

描述

?

零次或一次出现

*

零次或多次出现

+

一次或多次出现

{n}

恰好n次出现

{n, m}

至少n次出现,最后m次出现

{n, }

至少n次出现

2、贪婪的,惰性的和支配性的量词
贪婪量词:先看整个字符串是否匹配成功,如果没有发现匹配,它去掉该字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复知道发现一个匹配或者字符串不剩任何字符。目前讨论的所有量词都是贪婪量词。
惰性量词:先看字符串中的第一个字符是否匹配,如果单独这一个字符不够,就读入下一个字符,组成两个字符的字符串。如果还是没有发现匹配,惰性量词就继续从字符串中添加字符直到发现匹配或者整个字符串都检查过也没有匹配。
支配量词:只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。

贪婪

惰性

支配

描述

?

??

?+

零次或一次出现

*

*?

*+

零次或多次出现

+

+?

++

一次或多次出现

{n}

{n}?

{n}+

恰好n次出现

{n, m}

{n, m}?

{n, m}+

至少n次出现,最后m次出现

{n, }

{n, }?

{n, }+

至少n次出现


复杂模式:
复杂模式不仅仅由字符类和量词组成,也可以由分组、反向引用、前瞻和其他一些强大的正则表达式功能组成。
1、分组,是通过一系列括号包围一系列字符、字符类以及量词来使用的。例如:
var re1 = /(dog)?/  匹配“dog”的零次或一次出现
var re2 = /(dog)*/  匹配“dog”的零次或多次出现
var re3 = /(dog)+/  匹配“dog”的一次或多次出现
var re = /([bd]ad?)*/    匹配下列字符的零次或多次出现:ba, bad, da, dad

2、反向引用,在表达式计算完之后,每个分组都被存放在一个特殊的地方以备将来使用。这些存储在分组中的特殊值,称之为反向引用。
    反向引用是按照从左到右遇到的左括号字符的顺序进行创建和编号的。其可以有以下几种不同的用于:
(1)使用正则表达式对象的test(), match()和search()方法后,反向引用的值可以从RegExp构造函数中获得
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var sToMatch = "#1242455"
  3. var reNumbers = /#(\d+)/; 
  4. reNumbers.test(sToMatch); 
  5. alert(RegExp.$1); 
  6. </script> 
<script type="text/javascript">
var sToMatch = "#1242455";
var reNumbers = /#(\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);
</script>
(2)直接在定义分组的表达式中包含反向引用。这可以通过使用特殊转义字符序列如\1,\2等实现。
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var sToMatch = "dogdog"
  3. var reDog = /(dog)\1/; 
  4. alert(reDog.test(sToMatch)); 
  5. </script> 
<script type="text/javascript">
var sToMatch = "dogdog";
var reDog = /(dog)\1/;
alert(reDog.test(sToMatch));
</script>
    正则表达式reDog首先创建单词dog的组,然后又被特殊转义字符\1引用,使得这个正则表达式等同于/dogdog/
(3)可以用在String对象的replace()方法中,通过使用特殊字符序列$1,  $2等来实现。例如,想将字符串“1234 5678”变为“5678 1234”,可以通过下面的代码:
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var sToChange = "1234 5678"
  3. var reMatch = /(\d{4}) (\d{4})/; 
  4. var sNew = sToChange.replace(reMatch,"$2 $1"); 
  5. alert(sNew); 
  6. </script> 
<script type="text/javascript">
var sToChange = "1234 5678";
var reMatch = /(\d{4}) (\d{4})/;
var sNew = sToChange.replace(reMatch, "$2 $1");
alert(sNew);
</script>
3、候选
候选操作符和ECMAScript的二进制异或一样,是一个管道符(|),它放在两个单独的模式之间。
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var sToMatch1 = "red"
  3. var sToMatch2 = "blue"
  4. var reRedOrBlue = /(red|blue)/; 
  5. alert(reRedOrBlue.test(sToMatch1)); 
  6. alert(reRedOrBlue.test(sToMatch2)); 
  7. </script> 
<script type="text/javascript">
var sToMatch1 = "red";
var sToMatch2 = "blue";
var reRedOrBlue = /(red|blue)/;
alert(reRedOrBlue.test(sToMatch1));
alert(reRedOrBlue.test(sToMatch2));
</script>

4、非捕获性分组
创建反向引用的分组,称之为捕获性分组。同时还有非捕获性分组,它不会创建反向引用。在较长的正则表达式中,存储反向引用会降低匹配速度。通过使用非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销。
    如果要创建一个非捕获性分组,只要在左括号的后面加上一个问号和一个紧跟的冒号:
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var sToMatch = "#123456"
  3. var reNumbers = /#(?:\d+)/; 
  4. reNumbers.test(sToMatch); 
  5. alert("here"); 
  6. alert(RegExp.$1); 
  7. alert(sToMatch.replace(reNumbers, "abcd$1")); 
  8. </script> 
<script type="text/javascript">
var sToMatch = "#123456";
var reNumbers = /#(?:\d+)/;
reNumbers.test(sToMatch);
alert("here");
alert(RegExp.$1);
alert(sToMatch.replace(reNumbers, "abcd$1"));
</script>

5、前瞻
告诉正则表达式运算器向前看一些字符而不移动其位置。同样存在正向前瞻和负向前瞻。正向前瞻检查的是接下来出现的是不是某个特定的字符集。而负向前瞻则是检查接下来的不应该出现的特定字符集。
创建正向前瞻要将模式放在(?=和)之间。注意这不是分组,虽然也用到括号。
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var sToMatch1 = "bedroom"
  3. var sToMatch2 = "bedding"
  4. var reBed = /(bed(?=room))/; 
  5. alert(reBed.test(sToMatch1)); 
  6. alert(RegExp.$1); 
  7. alert(reBed.test(sToMatch2)); 
  8. </script> 
<script type="text/javascript">
var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?=room))/;
alert(reBed.test(sToMatch1));
alert(RegExp.$1);
alert(reBed.test(sToMatch2));
</script>
创建负向前瞻要将模式放在(?!和)之间。
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2. var sToMatch1 = "bedroom"
  3. var sToMatch2 = "bedding"
  4. var reBed = /(bed(?!room))/; 
  5. alert(reBed.test(sToMatch1)); 
  6. alert(RegExp.$1); 
  7. alert(reBed.test(sToMatch2)); 
  8. </script> 
<script type="text/javascript">
var sToMatch1 = "bedroom";
var sToMatch2 = "bedding";
var reBed = /(bed(?!room))/;
alert(reBed.test(sToMatch1));
alert(RegExp.$1);
alert(reBed.test(sToMatch2));
</script>
javascript支持前瞻,但是不支持后瞻

6、边界
用于正则表达式中表示模式的位置。

边界

描述

^

行开头

$

行结尾

\b

单词的边界

\B

非单词的边界

[javascript] view plain copy print ?
  1. <!--边界 
  2. 查找一个单词,但要出现在行尾--> 
  3. <script type="text/javascript"
  4.     var sToMatch = "Important word is the last one."
  5.     var reLastWord = /(\w+).$/; 
  6.     reLastWord.test(sToMatch); 
  7.     alert(RegExp.$1); 
  8. </script> 
<!--边界
查找一个单词,但要出现在行尾-->
<script type="text/javascript">
	var sToMatch = "Important word is the last one.";
	var reLastWord = /(\w+).$/;
	reLastWord.test(sToMatch);
	alert(RegExp.$1);
</script>
7、多行模式,在正则表达式后面添加一个m选项。比较下面的输出:
[javascript] view plain copy print ?
  1. <script type="text/javascript"
  2.     var x; 
  3.     var sToMatch = "First second\n third fourth\n fifth sixth"
  4.     var reLastWord = /(\w+)$/g; 
  5.     var arrWords = sToMatch.match(reLastWord); 
  6.     for(x in arrWords){ 
  7.         document.write(arrWords[x] + "</br>"); 
  8.     } 
  9.     var reLastWord = /(\w+)$/gm; 
  10.     var arrWords = sToMatch.match(reLastWord); 
  11.     for(x in arrWords){ 
  12.         document.write(arrWords[x] + "</br>"); 
  13.     } 
  14. </script> 
<script type="text/javascript">
	var x;
	var sToMatch = "First second\n third fourth\n fifth sixth";
	var reLastWord = /(\w+)$/g;
	var arrWords = sToMatch.match(reLastWord);
	for(x in arrWords){
		document.write(arrWords[x] + "</br>");
	}
	var reLastWord = /(\w+)$/gm;
	var arrWords = sToMatch.match(reLastWord);
	for(x in arrWords){
		document.write(arrWords[x] + "</br>");
	}
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript正则表达式和Java正则表达式在语法上有一些差异,但是它们的基本概念和用法是相似的。下面是将JavaScript正则表达式转换为Java正则表达式的一些常见规则: 1. 语法差异: - JavaScript正则表达式使用斜杠(/)作为定界符,而Java正则表达式使用双引号(")作为定界符。 - JavaScript正则表达式中的特殊字符需要进行转义,而Java正则表达式中的特殊字符不需要转义。 2. 字符类: - JavaScript正则表达式中的字符类使用方括号([])表示,而Java正则表达式中使用方括号([])或者Unicode转义(\p{...})表示。 - JavaScript正则表达式中的字符类可以使用连字符(-)表示范围,而Java正则表达式中需要使用Unicode转义(\uXXXX)表示范围。 3. 量词: - JavaScript正则表达式中的量词使用花括号({})表示,而Java正则表达式中使用花括号({})或者问号(?)表示。 - JavaScript正则表达式中的贪婪量词默认是贪婪模式,而Java正则表达式中的贪婪量词需要在后面添加问号(?)来表示非贪婪模式。 4. 边界匹配: - JavaScript正则表达式中的边界匹配使用插入符号(^)和美元符号($)表示,而Java正则表达式中使用\A和\Z表示。 5. 其他差异: - JavaScript正则表达式中的捕获组使用圆括号(())表示,而Java正则表达式中使用圆括号(())或者方括号([])表示。 - JavaScript正则表达式中的反向引用使用反斜杠加数字(\1、\2等)表示,而Java正则表达式中使用美元符号加数字($1、$2等)表示。 以上是一些常见的JavaScript正则表达式转换为Java正则表达式的规则。具体转换时,还需要根据具体的正则表达式进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值