to hdt(倦怠): 首先谢谢你的参与!你的这种方法确实可以判断出3all8这种数字开头数字结尾的情况,但对于ealle这种不是数字开头数字结尾的情况我的题意是不匹配,而单从你上面的测试就会成为匹配。当然可以再加一层去处理。 然而,如果再把题目加深一层,这种方法就失效了(不一定失效,只是我暂时没想到如何应用):我想替换一段文章中所有:一个数字开头一个数字结尾,但中间"不是all"的其它任意三位字母的数据,替换为%。3all72abc14qq4 替换后为:3all7%4qq4
using System; using System.Collections; using System.IO; using System.Text.RegularExpressions; public class MyClass { public static void Main() { string s="3all72abc14qq4"; string tmp=System.Text.RegularExpressions.Regex.Replace(s,@"[\d]abc[\d]",new MatchEvaluator(str_replace)); Console.WriteLine(s); Console.WriteLine(tmp); Console.ReadLine(); } public static string str_replace(Match match) { if(match.Value!=null|match.Value!="") { return match.Value.Substring(0,1)+"%"+match.Value.Substring(match.Value.Length-1,1); } return match.Value; }
to redwolf_123(雨恨云愁):我想在一段字符中取出一个数字开头中间不是abc一个数字结尾的值。比如如下一段:2acb44xss4ce2abc3 我希望取出的是:2acb4,4xss4可能我确实是在钻牛角尖,但我觉得有意义。最起码有这样的实例场景(我是碰到一个CSDN中的问题刚好需要这样才发现并提问的),如果能找到最简便的方法不是很好吗?(因为对正则算是在学习期,所以不清楚到底可不可以用一个正则去匹配)
if (!r.IsMatch(s))
{
Console.WriteLine("is not abc");
}
else
{
Console.WriteLine("is abc");
}反其道而行,不知道楼主要的是不是这效果...
匹配以数字开头数字结尾,但中间不是all的内容。
匹配:43alll3232,3al3,4b3
但不匹配:3all3,4all89
string strpatten = "\\dall\\d";
string[] str =new string[4];
str[0] ="43alll3232";
str[1] = "3al3";
str[2] = "4b3";
str[3] = "3all3";
System.Text.RegularExpressions.Regex regx = new Regex( strpatten );
for( int i=0 ; i<4 ; i++ )
{
System.Text.RegularExpressions.MatchCollection match = regx.Matches( str[i]);
Console.WriteLine( "{0}" , match.Count==0?"匹配":"不匹配" );
}
首先谢谢你的参与!你的这种方法确实可以判断出3all8这种数字开头数字结尾的情况,但对于ealle这种不是数字开头数字结尾的情况我的题意是不匹配,而单从你上面的测试就会成为匹配。当然可以再加一层去处理。
然而,如果再把题目加深一层,这种方法就失效了(不一定失效,只是我暂时没想到如何应用):我想替换一段文章中所有:一个数字开头一个数字结尾,但中间"不是all"的其它任意三位字母的数据,替换为%。3all72abc14qq4
替换后为:3all7%4qq4
有必要这么麻烦么?
直接用replace就号了
有必要这么麻烦么?
___________________________你是指怎么用?如果能解决这类问题,当然就行。我特别不想麻烦。
用()将abc分为一组(abc),在^[(abc)],不知可以吗?
_______________________________________________________你是指的:[^(abc)]这样用吧?
不行,这相当于匹配除了abc()这五个字符以外的任意字符。
using System.Collections;
using System.IO;
using System.Text.RegularExpressions;
public class MyClass
{
public static void Main()
{
string s="3all72abc14qq4";
string tmp=System.Text.RegularExpressions.Regex.Replace(s,@"[\d]abc[\d]",new MatchEvaluator(str_replace));
Console.WriteLine(s);
Console.WriteLine(tmp);
Console.ReadLine();
}
public static string str_replace(Match match)
{
if(match.Value!=null|match.Value!="")
{
return match.Value.Substring(0,1)+"%"+match.Value.Substring(match.Value.Length-1,1);
}
return match.Value;
}
}
替换后为:3all7%4qq4
按照你的意思
string tmp=System.Text.RegularExpressions.Regex.Replace(s,@"[\d]abc[\d]",new MatchEvaluator(str_replace));
应该改成
string tmp=System.Text.RegularExpressions.Regex.Replace(s,@"[\d][a-zA-Z]{3}(?<!all)[\d]",new MatchEvaluator(str_replace));
零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。
?<!
零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配
匹配是不以all开头的字符串吧
^(?!all).*$
匹配是不以all开头的字符串吧
_______________________________是匹配除all以外的任意字符,包括:al,alll,gfds等等。
^[\w]*?(?<!(all[\d]*))$
^[\w]*?(?<!((all)+[\d]*))$
(?<!^all$)$
你可以试试:
Regex.IsMatch("任意值",@"(?<!^all$)$");除了abc外,任何值都会返回false。谢谢小熊让我发现了方向。
----楼主 (顶楼问题的正确答案)
"任意值"=="abc"
除了abc,任何值都会返回false. 不是一样的么?有必要这么做么??
"任意值"!="abc"
除了abc,任何值都会返回true. 不是一样的么?有必要这么做么??
从这里看确实没有必要。而我用的这种方法又不能应用到后面所列的场景中。
其实从根本上讲,这个问题还是没解决。重新描述一下我的根本意图:[^(all)]+
从这个可以大致看出我的目的,就是想得到:如何匹配一个不是abc的值。(可以是a可以是l,但不能是all)
我写的这个正则匹配的实际效果是all()这五个字符外的任意字符,当然,不是我想要的。
匹配:43alll3232,3al3,4b3
但不匹配:3all3,4all89
就是说all后跟哪些字符才是要的?
^[\w]*?(?<!((all)+[\d]*))$
如果出现all后面跟数字就不匹配
<?(all)all/D+|/D+>
no test
能不能实现这种语义(^(ab))即匹配除ab以外的任意字符?而ac和cb都可以正常匹配。
(假如用[^a][^b]就不能匹配ac,cb)
??
其实我觉得你有点在钻进死胡同了
都有点不知道你到底要什么了。
很多时候要具体的问题具体解决
如果你想要
1:判断一个句子中是否有abc那么 有的话不匹配 没的话匹配
那么 Regex reg = new Regex ("abc"); reg.Match(string) 就可以得到是否匹配
2:如果你想替换掉abc的话 笔直用replace
3: 如果你想获得除了abc外的其它字符 那么把他 replace后赋值就可以了
4:。。
很多具体的情况都能有;类似的变通的方法。。
我希望取出的是:2acb4,4xss4可能我确实是在钻牛角尖,但我觉得有意义。最起码有这样的实例场景(我是碰到一个CSDN中的问题刚好需要这样才发现并提问的),如果能找到最简便的方法不是很好吗?(因为对正则算是在学习期,所以不清楚到底可不可以用一个正则去匹配)
这个表达式匹配前面一个数字后面一个数字中间任意两个字符,但这两个字符不能是ab发现要做到我说的这一点,必须根据上下文写,才写得出。
\d(?!ab\d)表示匹配前面的一个数字,但这个数字后面不能跟ab加一个数字
.{2}表示任意两位字符。
(?<!\dab)\d表示匹配最后的一个数字,但这个数字前面不能跟一个数字加ab于是就达到前面一个数字,后面一个数字,中间两位任意字符但不能是ab的效果。呵呵,希望对大家有帮助。