各位好,
小弟近日 有一需求,需要匹配连续的数字,如123,456,正则表达式可以解决这个问题吗?
39 个解决方案
#1
那你就写在一个组里面(123)(456)然后再去做别的匹配嘛
#2
[\d]*
#3
学习
#4
引用 1 楼 zhengqian529 的回复:
那你就写在一个组里面(123)(456)然后再去做别的匹配嘛
我是想要通用 的写法啊,1234、呢?我需要匹配连续出现的N个数字。并希望能够匹配连续递减的数字。比如54321,98765,432等等。
#5
写JS用IF条件应该好控制一点
#6
[\d]+没有特殊的要求这个就够了
#7
不好意思,看错了
#8
这个嘛,自己写个程序就行了.
用有限自动机.
#9
这种复杂得 匹配 不如 函数判断来得 实在
#10
正则? 不可能吧
#11
//Try it.
string str = @"54321,98765,,432,98745";
Regex objRegex = new Regex(@"(?<=\D|^)(?:(?:9(?=8|\D))?(?:8(?=7|\D))?(?:7(?=6|\D))?(?:6(?=5|\D))?(?:5(?=4|\D))?(?:4(?=3|\D))?(?:3(?=2|\D))?(?:2(?=1|\D))?(?:1(?=0|\D))?(?:0(?=\D|$))?)(?=\D|$)");
MatchCollection objMatches = objRegex.Matches(str);
int i=0;
foreach (Match m in objMatches)
{
}
/*
//Result:
Result[1]:54321
Result[2]:98765
Result[3]:
Result[4]:432
*/
#12
//用C++写的用有限自动机解决这个匹配的程序.
//希望对你有帮助.
#include
#include
#include
#include
using namespace std;
int dfa[128][128];
void init()
{
for (int i = '0'; i
}
void match(const char* str)
{
int state = 0;
int last = 0;
for (int i = 0;; ++i)
{
char c = str[i];
if (!c)
{
if (i>last)
{
for (int j = last; j
puts("");
}
break;
}
if (dfa[state][c] == 0)
{
if (i>last)
{
for (int j = last; j
puts("");
}
if (isdigit(c)) state = c, last = i;
else state = 0, last = i + 1;
}
else
{
state = dfa[state][c];
}
}
puts("");
}
int main()
{
init();
match("abc123abc3465");
match("123a1bc123abc");
return 0;
}
#13
这个用语句判断简单点
#14
有请
过客来优化。
引用 11 楼 rainsome 的回复:
C# code//Try it.string str=@"54321,98765,,432,98745";
Regex objRegex=new Regex(@"(?<=\D|^)(?:(?:9(?=8|\D))?(?:8(?=7|\D))?(?:7(?=6|\D))?(?:6(?=5|\D))?(?:5(?=4|\D))?(?:4(?=3|\D))?(?:3(?=2|\D))?(?:2(?=1|\D))?(?:1(?=0|\D))?(?:0(?=\D|$))?)(?=\D|$)");
MatchCollection objMatches= objRegex.Matches(str);int i=0;foreach (Match min objMatches)
{
}/*
//Result:
Result[1]:54321
Result[2]:98765
Result[3]:
Result[4]:432*/
#15
正则不是用来做这个的,直接用正则实现不了这功能,需要结合其它判定来实现
但是这样用正则是完全没必要的,这种功能完全可以自己写有穷自动机来实现,要比正则处理灵活快速得多
#16
比较好的做法: 使用正则表达式
^\d+$
#17
引用 14 楼 rainsome 的回复:
有请过客来优化。
引用 11 楼 rainsome 的回复:
C# code//Try it.string str=@"54321,98765,,432,98745";
Regex objRegex=new Regex(@"(? <=\D|^)(?:(?:9(?=8|\D))?(?:8(?=7|\D))?(?:7(?=6|\D))?(?:6(?=5|\D))?(?:5(?=4|\D))?(?:4(?=3|\D))?(?:3(?=2|\D))?(?:2(?=1|\D))?(?:1(?=0|\D))?(?:0(?=\D|$))?)(?=\D|$)");
MatchCollection objMatches= objRegex.Matches(str);int i=0;foreach (Match min objMatches)
{
}/*
//Result:
Result[1]:54321
Result[2]:98765
Result[3]:
Result[4]:432*/
哈哈,居然这样用,穷举了,好,晚上回去优化一下
#18
可以先提取数字在来判断啊
#19
等待优化结果了
#20
正则用于这方面应该不可取,通过分分割字符串,判断是否连续
#21
这个用正则?
#22
引用 14 楼 rainsome 的回复:
Regex objRegex=new Regex(@"(? <=\D|^)(?:(?:9(?=8|\D))?(?:8(?=7|\D))?(?:7(?=6|\D))?(?:6(?=5|\D))?(?:5(?=4|\D))?(?:4(?=3|\D))?(?:3(?=2|\D))?(?:2(?=1|\D))?(?:1(?=0|\D))?(?:0(?=\D|$))?)(?=\D|$)");
又考虑了下,这个问题用正则来解决终究还是不可取的
14楼的实现上有bug,比如
string str = @"98765";
是匹配不到任何值的
但即使修改了bug,需要考虑的情况也是比较多,不适合用一个正则来解决,如果非要用正则,可以用正则来提取数字子串,再通过自己写逻辑来验证是否连续的数字
其实这种需求不用正则更好一些,直接写逻辑也不会是多困难的事
#23
用DFA的方法我已经示范过了...只需要O(n)的扫描.只示例了上升的,下降的可以再扫描一遍.
#24
fffffff
#25
引用 11 楼 rainsome 的回复:
C# code//Try it.string str=@"54321,98765,,

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/17312.html