正则表达式如何重复匹配?

Zimmerk 2012-06-05 06:04:33
比如我的格式是:
标识<内容>

S<Hello>A<0>S<Hi>S<??>

我写的正则是:([SA]<[^<>]*>)*
但就是不能匹配成
S<Hello>
A<0>
S<Hi>
S<??>

请问这种正则应该怎么写?
...全文
272 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiuchang 2012-06-05
  • 打赏
  • 举报
回复
正则式最后的*不需要吧
proorck6 2012-06-05
  • 打赏
  • 举报
回复
初步判断是贪婪量词的问题,建议试一下

([SA]<[^<>]*?>)*

Zimmerk 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

楼主,你的不是表达式有问题
而是代码有问题

C/C++ code
#include <boost/regex.hpp>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main(int argc, char* argv[]) {
const char *szSt……
[/Quote]

果然如此,弄了一整天原来 是这个问题,多谢谢你了。
我等 下再加分,感谢大家的帮忙!
gabriel1017 2012-06-05
  • 打赏
  • 举报
回复
结贴给分咯
gabriel1017 2012-06-05
  • 打赏
  • 举报
回复
boost用的表达式和vi用的表达式比较接近
貌似叫perl的表达式类型吧
你的表达式貌似没问题
不过你的boost查找方法要换一下,
你用的boost::regex_match 只是用来判定或者断言的
要依次查找就得用查找迭代器
gabriel1017 2012-06-05
  • 打赏
  • 举报
回复
楼主,你的不是表达式有问题
而是代码有问题

#include <boost/regex.hpp>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int main(int argc, char* argv[]) {
const char *szStr = "S<Hello>A<0>S<Hi>S<aa>";
{
boost::regex reg("[SA]*<[^>]*?>");
boost::cregex_iterator itrBegin(szStr, szStr + strlen(szStr), reg);
boost::cregex_iterator itrEnd;
for (boost::cregex_iterator itr = itrBegin; itr != itrEnd; ++itr) {
// 指向子串对应首位置 指向子串对应尾位置 子串内容
// cout << (*itr)[0].first - szStr << ' ' << (*itr)[0].second - szStr
// << ' ' << *itr << endl;
cout << *itr << endl;
}
}

return 0;
}


运行结果:
S<Hello>
A<0>
S<Hi>
S<aa>
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
用VBSCript 在msscript.ocx控件中验证:
Function RegExp(ptn, txt) As String
Dim rtnstr As String
Dim codestr As String
rtnstr = ""
With ScriptControl1
' Set script language (VBScript is the default).
.Language = "VBScript"
' Set UI interaction (TRUE is the default).
.AllowUI = True
' Copy the script to the control.
'--------------------------------------------------------
codestr = ""
codestr = codestr + "Function RegExpTest(patrn, strng) " + vbCrLf
codestr = codestr + " Dim regEx, Match, Matches, RetStr " + vbCrLf
codestr = codestr + " Set regEx = New RegExp " + vbCrLf
codestr = codestr + " regEx.Pattern = patrn " + vbCrLf
codestr = codestr + " regEx.IgnoreCase = True " + vbCrLf
codestr = codestr + " regEx.Global = True " + vbCrLf
codestr = codestr + " Set Matches = regEx.Execute(strng) " + vbCrLf
codestr = codestr + " RetStr="""" " + vbCrLf
codestr = codestr + " For Each Match in Matches " + vbCrLf
codestr = codestr + " RetStr=RetStr+"";""+Match.Value" + vbCrLf
codestr = codestr + " RetStr=RetStr+"",""+Match.SubMatches(0)+"",""+Match.SubMatches(1)" + vbCrLf
codestr = codestr + " Next " + vbCrLf
codestr = codestr + " RegExpTest = RetStr " + vbCrLf
codestr = codestr + " Set regEx = Nothing " + vbCrLf
codestr = codestr + "End Function " + vbCrLf
'--------------------------------------------------------
.AddCode codestr
Dim oMod As Object
Set oMod = .Modules(GlobalModule)
rtnstr = oMod.Run("RegExpTest", ptn, txt)
Set oMod = Nothing
End With
RegExp = rtnstr
End Function

Private Sub Command1_Click()
Debug.Print RegExp("(.*?)<([^>]*?)>", "S<Hello>A<0>S<Hi>S<??>")
' 上面这条语句的运行结果:
' ;S<Hello>,S,Hello;A<0>,A,0;S<Hi>,S,Hi;S<??>,S,??
End Sub

赵4老师 2012-06-05
  • 打赏
  • 举报
回复
boost的正则表达式可能和regtest软件用的正则表达式在正则表达式语法上有细微区别。
Zimmerk 2012-06-05
  • 打赏
  • 举报
回复
楼上的大哥,不行啊,我还是给源码和运行结果吧。
#include "stdafx.h"
#include <boost/regex.hpp>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
boost::regex e("(.*?)<([^>]*?)>");
boost::smatch result;
std::string str("S<Hello>A<0>S<Hi>S<aa>");
boost::regex_match(str, result, e);
for (int i = 0; i < result.size(); i++)
{
std::cout<<result[i]<<endl;
}

return 0;
}


运行结果:
S<Hello>A<0>S<Hi>S<aa>
S<Hello>A<0>S<Hi>S
aa
请按任意键继续. . .
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)
http://download.csdn.net/detail/zhao4zhong1/1808549
赵4老师 2012-06-05
  • 打赏
  • 举报
回复
字符串:S<Hello>A<0>S<Hi>S<??>
正则表达式:(.*?)<([^>]*?)>
匹配结果:
1.S<Hello>
(1).S (2).Hello
2.A<0>
(1).A (2).0
3.S<Hi>
(1).S (2).Hi
4.S<??>
(1).S (2).??

推荐使用regtest软件
Zimmerk 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

正则式最后的*不需要吧
[/Quote]
没有那个*,一个也匹配不了……
Zimmerk 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

初步判断是贪婪量词的问题,建议试一下

([SA]<[^<>]*?>)*
[/Quote]
不行,只能匹配到最后一个 S<??>

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧