正则表达式。。。求助

miforum 2010-10-12 10:08:03
现有,文本文档中的内容格式如下:

1、广州/深圳/珠海/佛山
2、www.baidu.com/abc/123/bcd/456.html
3、广州市天河北路,510000/深圳市福田区,5100003
4、【广东】广州天河区中山大道88号winte酒吧
5、www.Google.com/abc/123/bcd/456.html

想实现的效果是——替换后,文本文档中的内容变为:

1、广州;深圳;珠海;佛山
2、www.baidu.com/abc/123/bcd/456.html
3、广州市天河北路,510000
深圳市福田区,5100003
5、www.Google.com/abc/123/bcd/456.html


即:将中文与中文之间的“/”替换为“;”,数字与中文之间的“/”替换成换行且加2个空格。而英文与英文之间的“/”,英文与数字之间的“/”,数字与数字之间的“/”,数字与英文之间的“/”不替换。此外,凡事遇到“【汉字】”的,将此行文字全部删除,下面的一行顶上来(如果难度大的话,下面一行不顶上来也行)。

我每次取,都会取出一个中文字,没辙了。。正则确实有点头大。求大大帮忙~~~谢谢~最好能做成一个函数供调用。
...全文
168 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-10-13
  • 打赏
  • 举报
回复
写一个vb.net的方法,可以一行实现,不过我不指望你能看懂了。。。

Public Sub TestRegex03()
Dim s As String = "1、广州/深圳/珠海/佛山" + vbCrLf + "2、www.baidu.com/abc/123/bcd/456.html" + vbCrLf + "3、广州市天河北路,510000/深圳市福田区,5100003" + vbCrLf + "4、【广东】广州天河区中山大道88号winte酒吧" + vbCrLf + "5、www.Google.com/abc/123/bcd/456.html"
Dim result As String = Regex.Replace(s, "(?<=(?<ac>[\u4E00-\u9FA5])|(?<al>[a-zA-Z])|(?<ad>[0-9]))+(/)(?=(?<bc>[\u4E00-\u9FA5])|(?<bl>[a-zA-Z])|(?<bd>[0-9]))+|(?<remove>([\r\n]+|^)\s*[^\r\n]*?【[\u4E00-\u9FA5]+】[^\r\n]*([^\r\n]|$))", Function(m As Match) IIf(m.Groups("ac").Success And m.Groups("bc").Success, ";", IIf((m.Groups("ac").Success And m.Groups("bd").Success) Or (m.Groups("ad").Success And m.Groups("bc").Success), vbCrLf + " ", IIf(m.Groups("remove").Success, "", m.Value))))
Console.WriteLine(result)
End Sub


输出

1、广州;深圳;珠海;佛山
2、www.baidu.com/abc/123/bcd/456.html
3、广州市天河北路,510000
深圳市福田区,5100003
5、www.Google.com/abc/123/bcd/456.html
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复

Sub GetNewTxt()
Dim oJs As Object, Str$

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.replace(/(^|\s)\【\S+/g,'') " _
& ".replace(/(\d+)(\/)(?=[一-龥])/g,'$1 ') " _
& ".replace(/\/(?=[一-龥])/g,';')}"

Open App.Path & "\001.txt" For Input As #1
Str = Replace(Replace(StrConv(InputB(LOF(1), 1), vbUnicode), " ", "↑"), vbCrLf, " "): Reset
Str = Replace(oJs.codeobject.gets(Str), " ", vbCrLf)

Open App.Path & "\001.txt" For Output As #1
Print #1, Replace(Str, "↑", " "): Reset
End Sub

ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
这个和空格转换成换行符有关,因为你之前的文本没有空格所以没有考虑这个因素。以后求助时,应该提供最接近自己真实意图的附件。
miforum 2010-10-13
  • 打赏
  • 举报
回复
十分感谢!!刚才那代码已经很好啦~~还有一点点问题,具体请见详述。

规范一下我的文档格式,以及“真正需求”。
原始文档格式如下:

PP 深圳地王大厦
AA 广州/深圳/珠海/佛山
WT www.baidu.com/abc/123/bcd/456.html
TU 广州市长大厦
AD 广州市天河北路,510000/深圳市福田区,5100003/东莞市樟木头镇,510000
XD west262.1 my name is
【广东】广州天河区中山大道88号winte酒吧
CE 广州耀中广场
QD www.Google.com/abc/123/bcd/456.html
AN 广州CBD2.0
XT 广州市环市东路378号

文档格式说明:除了以 【汉字】 开头的行之外,每一行最前面都有2个大写英文字母,然后空一格,紧接着是内容。

我要实现的效果是:

PP 深圳地王大厦
AA 广州;深圳;珠海;佛山
WT www.baidu.com/abc/123/bcd/456.html
TU 广州市长大厦
AD 广州市天河北路,510000
深圳市福田区,5100003
东莞市樟木头镇,510000
XD west262.1 my name is

CE 广州耀中广场
QD www.Google.com/abc/123/bcd/456.html
AN 广州CBD2.0
XT 广州市环市东路378号

即:
1、中文与中文之间的“/”替换为“;”
2、数字与中文之间的“/”替换成换行且加3个空格(为了对齐)
3、而英文与英文之间的“/”,英文与数字之间的“/”,数字与数字之间的“/”,数字与英文之间的“/”不替换。
4、英文句子不能被拆散(具体,请看下面您给我的15楼程序 执行效果)

您15楼给我的程序执行效果如下:

PP
深圳地王大厦
AA
广州;深圳;珠海;佛山
WT
www.baidu.com/abc/123/bcd/456.html
TU
广州市长大厦
AD
广州市天河北路,510000
深圳市福田区,5100003
东莞市樟木头镇,510000
XD
west262.1
my
name
is
【广东】广州天河区中山大道88号winte酒吧
CE
广州耀中广场
QD
www.Google.com/abc/123/bcd/456.html
AN
广州CBD2.0
XT
广州市环市东路378号



感谢热心回复!!感激不尽。。
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
希望是最终的代码:

Sub GetNewTxt()
Dim oJs As Object, Str$

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.replace(/(^|\s)\S+?【\S+/g,'') " _
& ".replace(/(\d+)(\/)(?=[一-龥])/g,'$1 ') " _
& ".replace(/\/(?=[一-龥])/g,';')}"

Open App.Path & "\001.txt" For Input As #1
Str = Replace(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf, " "): Reset
Str = Replace(oJs.codeobject.gets(Str), " ", vbCrLf)

Open App.Path & "\001.txt" For Output As #1
Print #1, Str: Reset
End Sub
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
“只要某一行文本是以【汉字】开头的,就将此行文字删掉。”
——这样说就又有问题了,你上面提供的示例并不是这样开头的,前面还有字符……
请规范你的要求。
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
最后写入002.txt是为了比对方便,楼主可以修改回相应文件名称。
miforum 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 alzeng 的回复:]
看了十三楼你“真正想要的”,确认是否有【的行才删除?我之前是按不含/即删除的。
[/Quote]

感谢回复!

是的。就是说:只要某一行文本是以【汉字】开头的,就将此行文字删掉。

比如以下文本:

【地点】 大大3444的飒飒的撒
大事的搜索的

结果为:
大事的搜索的
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
已做修改:

Sub GetNewTxt()
Dim oJs As Object, Str$

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.replace(/(^|\s)\S+【\S+/g,'') " _
& ".replace(/(\d+)(\/)(?=[一-龥])/g,'$1 ') " _
& ".replace(/\/(?=[一-龥])/g,';')}"

Open App.Path & "\001.txt" For Input As #1
Str = Replace(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf, " "): Reset
Str = Replace(oJs.codeobject.gets(Str), " ", vbCrLf)

Open App.Path & "\002.txt" For Output As #1
Print #1, Str: Reset
End Sub

ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
看了十三楼你“真正想要的”,确认是否有【的行才删除?我之前是按不含/即删除的。
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
关于自动换行:

Sub GetNewTxt()
Dim oJs As Object, Str$

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.match(/(^|\s)\S+\/\S+/g,'').join('') " _
& ".replace(/(\d+)(\/)(?=[一-龥])/g,'$1 ') " _
& ".replace(/\/(?=[一-龥])/g,';')}"

Open App.Path & "\001.txt" For Input As #1
Str = Replace(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf, " "): Reset
Str = Replace(oJs.codeobject.gets(Str), " ", vbCrLf)

Open App.Path & "\002.txt" For Output As #1
Print #1, Str: Reset
End Sub
miforum 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 alzeng 的回复:]
第三行换行,第一行不换行,判断的依据是什么?
[/Quote]
我是想判断:遇到 【数字与中文之间的“/”】,就换行,同时加2个空格在前面。比如下面这行文本:

3、广州市天河北路,510000/深圳市福田区,5100003/东莞市樟木头镇,510000

遇到 【数字与中文之间的“/”】时,就换行,同时后面文本再加2个空格,结果如下:

3、广州市天河北路,510000
深圳市福田区,5100003
东莞市樟木头镇,510000

========================================================

此外,能否帮我看一下 下面的问题:
========================================================
我运行您给我的这段程序之后,会我文本文档中的其他内容删除。比如,我原先文本是:

深圳地王大厦
1、广州/深圳/珠海/佛山
2、www.baidu.com/abc/123/bcd/456.html
广州市长大厦
3、广州市天河北路,510000/深圳市福田区,5100003/东莞市樟木头镇,510000
west262.1
4、【广东】广州天河区中山大道88号winte酒吧
广州耀中广场
5、www.Google.com/abc/123/bcd/456.html
广州CBD2.0
广州市环市东路378号

运行程序后的结果是:


1、广州;深圳;珠海;佛山

2、www.baidu.com/abc/123/bcd/456.html

3、广州市天河北路,510000;深圳市福田区,5100003;东莞市樟木头镇,510000

5、www.Google.com/abc/123/bcd/456.html


把文本中的其他内容删掉了。而我真正想要的是:

深圳地王大厦
1、广州;深圳;珠海;佛山
2、www.baidu.com/abc/123/bcd/456.html
广州市长大厦
3、广州市天河北路,510000
深圳市福田区,5100003
东莞市樟木头镇,510000
west262.1

广州耀中广场
5、www.Google.com/abc/123/bcd/456.html
广州CBD2.0
广州市环市东路378号

再次感谢回复!
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
第三行换行,第一行不换行,判断的依据是什么?
miforum 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 miforum 的回复:]
引用 6 楼 alzeng 的回复:
路径和文件名请自行修改:

VB code

Sub GetNewTxt()
Dim oJs As Object, Str$

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.ma……
[/Quote]

貌似可以了。但是第三行的没有换行。麻烦再帮我看看,多谢!
miforum 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jhone99 的回复:]
中文与中文之间的“/”
******************
(?<=[\u4e00-\u9fa5])/(?=[\u4e00-\u9fa5])
[/Quote]
1L大哥。vb中的正则似乎不能用 问号。

程序提示:方法IregExp2失败
miforum 2010-10-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 alzeng 的回复:]
路径和文件名请自行修改:

VB code

Sub GetNewTxt()
Dim oJs As Object, Str$

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.match(/(^|……
[/Quote]

6L大哥,运行有问题,没有改变文本。。应该是这里的乱码“一-龥”出了问题?
rimtd0314 2010-10-13
  • 打赏
  • 举报
回复
犀利,,,,
liaoyukun111 2010-10-13
  • 打赏
  • 举报
回复
学习.
ZenRoi 2010-10-13
  • 打赏
  • 举报
回复
路径和文件名请自行修改:

Sub GetNewTxt()
Dim oJs As Object, Str$

Set oJs = CreateObject("ScriptControl"): oJs.Language = "JScript"
oJs.eval "function gets(str){return str.match(/(^|\s)\S+\/\S+/g,'').join(' ').replace(/\/(?=[一-龥])/g,';')}"

Open App.Path & "\001.txt" For Input As #1
Str = Replace(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf, " "): Reset
Str = Replace(oJs.codeobject.gets(Str), " ", vbCrLf)

Open App.Path & "\001.txt" For Output As #1
Print #1, Str: Reset
End Sub
miforum 2010-10-13
  • 打赏
  • 举报
回复
不厌其烦帮忙,真的非常感谢!!!!!!结贴!
加载更多回复(7)

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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