正则表达式!如何只让它得出匹配前10个后就不再继续查询了?

作者&投稿:乘品 (若有异议请与网页底部的电邮联系)
正则表达式如何只匹配一个~

你用的是贪婪匹配.*,就是尽可能多的长的去匹配
应该用非贪婪匹配.*?,就是尽可能少的短的去匹配
另外,你用的eregi函数,php5.3x后已不再支持,换成了preg_match和preg_match_all函数
我给你一个完整的PHP匹配程序,你看看吧

事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确。就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问题:


复制代码
代码如下:

^((?!hede).)*$

上面这个表达式就能过滤出不包含‘hede'字串的信息。我上面也说了,这种写法并不是正则表达式“擅长”的用法,但它是可以这样用的。


解释

一个字符串是由n个字符组成的。在每个字符之前和之后,都有一个空字符。这样,一个由n个字符组成的字符串就有n+1个空字符串。我们来看一下“ABhedeCD”这个字符串:



所有的e编号的位置都是空字符。表达式(?!hede).会往前查找,看看前面是不是没有“hede”字串,如果没有(是其它字符),那么.(点号)就会匹配这些其它字符。这种正则表达式的“查找”也叫做“zero-width-assertions”(零宽度断言),因为它不会捕获任何的字符,只是判断。

在上面的例子里,每个空字符都会检查其前面的字符串是否不是‘hede',如果不是,这.(点号)就是匹配捕捉这个字符。表达式(?!hede).只执行一次,所以,我们将这个表达式用括号包裹成组(group),然后用*(星号)修饰——匹配0次或多次:

复制代码
代码如下:

((?!hede).)*。

你可以理解,正则表达式((?!hede).)*匹配字符串"ABhedeCD"的结果false,因为在e3位置,(?!hede)匹配不合格,它之前有"hede"字符串,也就是包含了指定的字符串。


在正则表达式里, ?! 是否定式向前查找,它帮我们解决了字符串“不包含”匹配的问题。

以下是一些补充:

分享下php生成随机数的三种方法,生成1-10之间的不重复随机数,php生成不重复随机数的例子,需要的朋友参考下。

在hacker news上看到regex golf,几道很有趣的正则表达式的题,有的需要用到不匹配这种匹配,比如需要匹配不包含某个单词的串。

开始正题之前,先来看看正则表达式的语法:

[abc] a或b或c . 任意单个字符 a? 零个或一个a
[^abc] 任意不是abc的字符 \s 空格 a* 零个或多个a
[a-z]
a-z的任意字符 \S 非空格 a+ 一个或多个a
[a-zA-Z] a-z或A-Z \d 任意数字 a{n} 正好出现n次a
^ 一行开头 \D
任意非数字 a{n,} 至少出现n次a
$ 一行末尾 \w 任意字母数字或下划线 a{n,m} 出现n-m次a
(...) 括号用于分组 \W
任意非字母数字或下划线 a*? 零个或多个a(非贪婪)
(a|b) a或b \b 单词边界 (a)...\1 引用分组
(?=a) 前面有a
(?!a) 前面没有a \B 非单词边界

正则表达式中有(?=a)和(?!a)来表示我们是否需要匹配某个东西。

所以,有需要不匹配某样内容时,就可以用(?!a)了。比如要匹配不含hello的字符串就可以这样写。



复制代码
代码如下:


^(?!.*hello)




这里.*用来表示hello之前可能有其他的字符,为什么还要加^呢,因为如果不加的话,可能匹配到h之后的这个位置上了。

现在就可以解决regex
golf上的abba这道题了。
这道题是去匹配不含abba这种形式的单词,比如abba,anallagmatic就不应该匹配上。

正则表达式代码:



复制代码
代码如下:


^(?!.*(.)(.)\2\1)




然后利用不匹配,还可以解决prime这道题,这道题匹配有素数个x的串,先看正则。



复制代码
代码如下:


^(?!(xx+)\1+$)




(xx+)是匹配2个及2个以上的x,(xx+)\1+就是匹配重复出现2个及以上的串,所以(xx+)\1+就表示了那些非素数的串,那么素数串就是除去这些非素数串,即是以上的正则表达式了。

我先给你写出javascript正则的写法, 发表后我再帮你改成VB的, 正在测试, ==发布给你.

补充:
javascript版:
<script>
var maxMatches = 10; //最多查找几个
var teststr = "a,.fmdskjajg, jkfldak klsgkajfkjdakkfdkjkfgja.xjfei(@)((@#gjkfdjkaksgajkg";

function find(str, maxcount)
{
var result = [], temparr = null;
var re = /a.*?g/ig; //如果要区分大小写把"i"删除, 这里要设g是让exec继续查全文, 不然不会重设lastIndex
while(result.length < maxcount && (temparr = re.exec(str)) != null) //你可以把(temparr = re.exec(str))改成(temparr = str.match(re))来看看区别
{
//其实我觉得你自己就可以写出来, 只是脑瓜一时没转过弯来^_^, exec的查找会从lastIndex再向下找(如果没设就从开始找), String的match就不行了. 你可以把下面的注释打开看是不是一次次查找的.
//alert(temparr.index + "-" + temparr.lastIndex + "\t" + temparr);
result.push(temparr[0]);
}
return result;
}

var myresult = find(teststr, maxMatches);
alert(myresult.join("|||"));
</script>

补充:
vb版:
<script language="vbscript">
Dim maxMatches
maxMatches = 10 '最多查找几个

Function find(ByVal str, ByVal maxcount, ByRef result)
Dim tempmatches, k
Dim re
k = 1
Set re = New RegExp
re.Pattern = "a.*?g"
re.IgnoreCase = True
'在此向你说明, VB的正则很差, 无法完成你的要求, 可能是设计时的缺陷
'如果Global设为True, 则一次查完所有, 如果是False, RegExp竟然没有index属性可以设置以后从哪里开始再次的查找!!!!
'我用Visual Studio调试, 果看了所有RegExp的属性, 哎....
re.Global = False '如果为TRUE就会一次全部查完, VB里面只有Execute而没有Match方法, Match在VB里面变成了Execute返回的结果

'所以想了个折中的办法: 记录上次的位置然后查新字符串, 但这样的话我觉得会比一次性查完更慢吧, 你可以测一下非常大的字符串哪个快, 我没测?
Do While(k <= maxcount) '这里不能用UBound(result) <= maxcount, 因为它是动态数组
Set tempmatches = re.Execute(str)
If tempmatches.Count >= 1 Then
Dim match
Set match = tempmatches.Item(0)
result(k) = match.Value
str = Mid(str, match.FirstIndex + match.Length + 1) '向后查新字符串
k = k + 1
Set match = Nothing
Else
Exit Do
End If
Loop
Set tempmatches = Nothing
Set re = Nothing
End Function

'测试
Dim myresult()
ReDim myresult(maxMatches)

Dim teststr
teststr = "a,.fmdskjajg, jkfldak klsgkajfkjdakkfdkjkfgja.xjfei(@)((@#gjkfdjkaksgajkg"

find teststr, maxMatches, myresult

Dim i
For i=1 To UBound(myresult)
MsgBox myresult(i)
Next
</script>

所以还是更喜欢javascript呀. 哈哈.

首先我不知道vb下的正则表达式规则有什么特别的,我认为所有正则表达式的基础规则是一样的,只是特殊规则特殊添加的。
“/^(你的字符串){10}/” 这个就是匹配你从开始前10个字符串的正则表达式。你看看和vb上有什么区别,自己改一下。


...则表达式 (a=b++)? ++a:b++的值是5, 该做如何解释?麻烦高手解释一下...
这个表达式先判断(a=b++)这个逻辑式是否成立,在执行该判断时a=5,b=4,故该逻辑式输出0,同时该逻辑式执行b++,故b=5.因为逻辑式输出0,故执行冒号后一条语句,在执行语句过程中b=5,执行完之后b=6,也就是说b++语句在逻辑式和输出过程中被分别执行了一次,而输出地是执行语句过程中的值...

若a是数值类型,则逻辑表达式(a==1)||(a!=1)的值是( )。
【答案】:B 当a=1时,(a==1)||(a!=1)为真;当a!=1时,(a==1)||(a!=1)也为真,故正确答案为B)。

js 正则表达式 ​var reg = \/(.*[0-9].*[0-9].*[0-9])\/ 是什么意思...
js中构造一个字符串变量时可以用两个正斜杠来代替双引号,改行代码也可改成 var reg = "(.*[0-9].*[0-9].*[0-9])";因此,正则表达式实际上是(.*[0-9].*[0-9].*[0-9])最外层括号代表捕获组,捕获组在此表达式中无实际用处,所以表达式也可看成 .*[0-9].*[0-9].*[0-9]...

正则表达式(\/[^0-9]\/g,'')中的"\/g"是什么意思 ???
如果regx=\/user\/d\/g,则rs的值为{user1,user2},rs2的值也为{user1,user2} 3,对于String对象的replace方法,表达式不加入g,则只替换第一个匹配,如果加入g,则替换所有匹配。(开头的三道测试题能很好的说明这一点) ,对于String对象的split方法,加上g与不加g是一样的,即:var sep=\/...

设有定义int a=20,b=3;则表达式a+=(b%=2)的值为——( B )为什么_百度...
按照运算优先级,先计算b%=2,由于是int型变量,则3%2=1,a+=(b%=2)即为a+=1,结果为21

变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)值为多少?
让我来依次回答:一、此表达式结果为9,当a++执行时,遇到下一个逗号时此自增表达式变已经结束,a的值已经更新,b同理。二、和上一条一样,你的分析是对的。三、010是八进制,以0(零)开头都是八进制,C\/C++无法直接表示二进制。

设x的值为5,则表达式(++x)+(++x)+(++x)的值是 24 为什么?
根编译器有关。VC++6.0的编译器对x=(++x)+(++x)+(++x)的算法如下:设x=5;则(++x)+(++x)+(++x)=((++x)+(++x))+(++x)即先算前两个++再算+,((++x)+(++x))+(++x)就等于(7+7)+8,结果为22。你用的编译器是先算括号里的++然后再把值加到一起。即(++x)+(++x)+...

求教一则dreamweaver正则表达式替换问题
正则表达式是用来对具有某种规律字符、字符串的模式表达,怎么可以用来只替换一个目标文本?那还不如不用正则呢,省的麻烦。这里我提供一种方法,仅供参考。查找:http:\/\/[^\/]+\/([\\w]+)-(\\d+\\.htm)(?:\\?search=.*)替换:$1\/$2l

如何批量给txt文档的某个位置增加换行呀?具体说明。我有2000多个文档...
用Word打开你的txt文件,替换“医院”为"^p”。也可以用UEStudio中的UltraEdit将“医院”替换为“^n”,文件很多时,可以同时打开所有文件,并将“替换范围”选为“所有打开文件”。本人验证了一下,使用“UEStudio' 06 版本06.60.0.1012”,对任意网址进行如下替换:查找“\/”替换为“^p”,保存...

如何使用正则表达式
此外圆括号在正则表达中两层含义,如果想让它解释为字面上意思(即圆括号),也需要在它前面用双反斜线字符(\\)。也就是像下面的一样: \\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{4} 现在介绍怎样在java代码中实现刚才所讲的正则表达式。要记住的事,在用正则表达式的包时,在你所定义的类前需要包含该包,也就是这样...

甘孜县17851777510: 请问正则表达式字符串,只想保留第一个该如何做? -
字梦安可: Java代码:import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s = "ssssssssgsdfasdasdasdasdjlkjhkjhalkasdasdjsdkajshdasdaklsjdasdhkjashgdaklsh"; System.out.println(s)...

甘孜县17851777510: 正则表达式中,怎么只取第一个结果 -
字梦安可: 不要用贪婪模式,即不加/g开关;如果框架有提供类似searchAll跟search的方法,选用search;满足前两项后,从全文的最开始处进行检索,通常而言,第一次检索就只会取到第一个结果 还有一种就是取多个group,然后拿第一个group的内容作为结果

甘孜县17851777510: 正则表达式只想匹配到字符第一次出现前的一段内容 -
字梦安可: 正则表达式:src='([^']+?)' 取第一捕获组的数据,就是你想要的数据了.

甘孜县17851777510: 正则表达式如何只匹配到一行的内容 -
字梦安可: ^“test”$^代表开头 $代表结尾; 以上是完全匹配 以下可能是你想要的, 取决于你的需求:^“test”$ 找“test” ^[^<]*$ 找 url 是"/browse/XCLL-299"的

甘孜县17851777510: 正则表达式匹配符合条件的字符的前一个字符 -
字梦安可: 第一个例子的正则表达式:.(?=男) 取第0捕获组的数据就是"y"和"n" 第二个例子的正则表达式:.(?=[a-z]) 取第0捕获组的数据就是"机"和"神" 注意:正则表达式的小括号(前面有一个英文句号或称小数点. 你把不同的匹配条件写在(?=xxx)xxx的位置就行了.

甘孜县17851777510: 正则如何匹配第一个字符 -
字梦安可: 匹配第一个字符的正则表达式 ^. 注意尖号后面有一个点,尖号代表行首,这个点代表除换行回车符外的任意字符<br>我给你一个Javascript语言的例子,你看看吧<br><script type=text/javascript><br><br> var str="#abc123";<br><br> var regex=/^./;<br><br> var result=str.match(regex);<br><br> alert(result);<br><br></script><br><br>运行结果<br>#

甘孜县17851777510: 在正则表达式怎么表达“只匹配某段但不包括某段”? -
字梦安可: 正则表达式匹配公式为:^((?!XXX).)*$,XXX为字符串. 另外列举一些正则表达式的语法: [abc] a或b或c . 任意单个字符 a? 零个或一个a [^abc] 任意不是abc的字符 \s 空格 a* 零个或多个a [a-z] a-z的任意字符 \S 非空格 a+ 一个或多个a [a-zA-Z] a-z或A-Z \d 任意数字 a{n} 正好出现n次a ^ 一行开头 \D 任意非数字 a{n,} 至少出现n次a $ 一行末尾 \w 任意字母数字或下划线 a{n,m} 出现n-m次a (...) 括号用于分组 \W 任意非字母数字或下划线 a*? 零个或多个a(非贪婪)

甘孜县17851777510: 正则表达式:如何只匹配一个字符串的前10位 -
字梦安可: var str=" 1234567890abcdefghijk5555555"; var rp = str.slice(0,11); console.log(rp)

甘孜县17851777510: 正则表达式,匹配前面不包含某个字符的字符串 -
字梦安可: rex = r'[^abcde]*'re.match(rex, 'this is a string')返回值是None则不匹配,反之匹配 当然先compile一下也很好.

甘孜县17851777510: 使用正则表达式匹配第一个遇到的字符 -
字梦安可: 第2版.大会彗星正则表达式类,公共 .装配变量表达式,反对.子程序_初始化,基于这个类在创建对象时后,该方法将被自动调用 .局部变量的脚本对象,该对象 .局部变量RET,变脚本对象.创建(“MSScriptControl.ScriptControl...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网