返回列表 发帖

[文本处理] 【已解决】批处理如何识别并提取文本中存在的11位手机号?

本帖最后由 taofan712 于 2017-2-10 20:59 编辑
寒蝉凄13切,对长亭晚,13311111111骤雨初歇。
都门帐饮无绪,留恋处舟催发。执手相看[color=Red]1355555
7777[/color]泪眼,竟无语凝噎。念15135去千里烟波,
暮霭沉1314沉楚天阔。  多情自古12580伤离别,
更那堪冷落清秋节。今宵酒醒何处?136杨柳岸晓风10010残月。
1372222444去经年,应是良辰好景虚设。
便纵10086有千种风情,更与何人说? 13788889999COPY
——————————————————
假设有类似文本,请问如何批处理自动识别其中的手机号码,并提取出来?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

首先手机号是一串数字,至于多长,是不一定的.如果单纯以移动联通为标准.那么哥已经帮你提取出来了.就这两条.不客气.
13311111111
13788889999
2

评分人数

TOP

回复 2# B魔方大人

以中国手机号为标准 ,固定11位。因为需要从各个杂乱文本中提取手机号码,组成www.bathome.com\sub\13344445555这样的网址,所以我想先把它取出来单独保存。
另外 13555557777 这个号码你没提取到。

TOP

perl
$all = `type src.txt`;
$all =~ s/\r?\n//g;
while ($all=~s/[^\d]?(\d{11})[^\d]?//)
{
    print "$1\n";
}COPY
2

评分人数

[url=][/url]

TOP

回复 4# 523066680
谢谢版主,请问有批处理方案吗?
新人刚开始学【绝非伸手党】,有个大概思路:
@echo off
echo on
setlocal enabledelayedexpansion
for %%a in (134 135 136 137 138 139 150 151 152 158 159 157 182 187 188 147  130 131 132 155 156  185 186   133 153  180 189) do (set 3a=%%a
for /f "delims=!3a! tokens=1*" %%b  in ('type a.txt^|find "!3a!"') do (
rem 我这个只能查到第一个出现数字的地方,这个delims和tokens要怎么写才能把每一行的所有数字都查到呢
set 8b=%%c
set "8b=!8b:~0,8!"
rem 这里判断变量8b是否全部是数字 if "!8b!"==(全部是数字)
echo,!3a!!8b!>>phnum.txt
)
)
pause>nulCOPY

TOP

本帖最后由 老刘1号 于 2017-2-9 15:10 编辑
'&wscript  -nologo -e:vbscript "%~0"
text=_
"寒蝉凄13切,对长亭晚,13311111111骤雨初歇。"&vbcrlf&_
"都门帐饮无绪,留恋处舟催发。执手相看[color=Red]1355555"&vbcrlf&_
"7777[/color]泪眼,竟无语凝噎。念15去135去千里烟波,"&vbcrlf&_
"暮霭沉1314沉楚天阔。  多情自古12580伤离别,"&vbcrlf&_
"更那堪冷落清秋节。今宵酒醒何处?136杨柳岸晓风10010残月。"&vbcrlf&_
"1372222此444去经年,应是良辰好景虚设。"&vbcrlf&_
"便纵10086有千种风情,更与何人说? 13788889999"
Function RegExpTest(patrn, strng)
   Dim regEx, Match, Matches   ' 建立变量。
   Set regEx = New RegExp   ' 建立正则表达式。
   regEx.Pattern = patrn   ' 设置模式。
   regEx.Global = True   ' 设置全局可用性。
   regEx.IgnoreCase = True   ' 设置是否区分字符大小写。
   Set Matches = regEx.Execute(strng)   ' 执行搜索。
   For Each Match in Matches   ' 遍历匹配集合。
      RetStr = RetStr & Match.Value& vbCRLF
   Next
   RegExpTest = RetStr
End Function
                        MsgBox(RegExpTest("1\d{10}", text))COPY
保存为CMD、BAT、VBS、VBE随意
1

评分人数

TOP

本帖最后由 B魔方大人 于 2017-2-9 15:28 编辑

bat.
1>1/* :
(@cscript -nologo -e:jscript %0<0.txt)>1.txt&exit
*/
var c = WSH.StdIn.ReadAll().replace(/.\r\n/g).match(/1[34578]\d{9}/g);
WSH.ECHO(c);COPY

TOP

本帖最后由 zz100001 于 2017-2-9 15:47 编辑

诉我直言,很多人已经不喜欢用批处理了
字符处理不好也不方便
于是给你的一般都是ps或者“混编批处理”(其实就是拿批处理启动其他脚本
电话号码如何识别你也没有明确的标准
这里就按11位数字来取好了
@echo off
set fn=a.txt
setlocal enabledelayedexpansion
set PhoneNumbers=
set pn=
set /a nc=0
call :PhoneNumberReader "%fn%"
echo 文件中包含的全部手机号:
echo %PhoneNumbers%
pause
goto :EOF
:PhoneNumberReader
echo %~s1
for /f "delims=" %%a in (%~s1) do (
    call :CharReader %%a
)
call :CheckPhoneNumber
goto :EOF
:CharReader
set l=%*
:CheckNumber
set /a n=!l:~,1! 1>nul 2>&1
if "!n!" equ "!l:~,1!" (
    set pn=!pn!!n!
    set /a nc+=1 1>nul 2>&1
) else (
    call :CheckPhoneNumber *
)
set l=!l:~1!
if "!l!" neq "" goto :CheckNumber
goto :EOF
:CheckPhoneNumber
if !nc! equ 11 (
    for %%a in (134 135 136 137 138 139 150 151 152 158 159 157 182 187 188 147 130 131 132 155 156 185 186 133 153 180 189) do (
        if "%%a" equ "!pn:~,3!" (
            echo 找到一个手机号:!pn!
            set PhoneNumbers=!PhoneNumbers!!pn!%1
            goto :CheckPhoneNumberOver
        )
    )
)
:CheckPhoneNumberOver
set pn=
set /a nc=0 1>nul 2>&1
goto :EOFCOPY
1

评分人数

    • taofan712: 再次谢谢,元宵快乐!技术 + 1

TOP

回复 6# 老刘1号
谢谢老刘
回复 7# B魔方大人
谢谢魔方大人

TOP

本帖最后由 taofan712 于 2017-2-10 13:51 编辑

回复 8# zz100001

非常感谢,你的代码完美的解决了我的问题。

有点遗憾,我10年就注册了批处理之家,中途都是偶尔看看,到现在才真正开始对批处理产生浓厚兴趣。
提这个问题更直接的原因也是想从中学习批处理而不是通过其他语言手段得到这个问题的答案。
所以真的特别感谢你写这么长的代码回答我的问题。
谢谢。
——————————
看到现在,终于看懂了,逐字找出连续11位数字,再对比前3位。

TOP

注定goto多次,注定慢... ...
@echo off & setlocal enabledelayedexpansion
:: 逐个字符找【11位,以1[34578]开头】的数字
for /f "delims=" %%i in ('type 1.txt') do (
call :split "%%i"
)
pause & exit /b
:: ------------------------------------------
:split [line]
if not defined line set line=%~1
set n=!line:~,1!
if not defined n goto :eof
if !n! leq 9 (
if !n! geq 0 (
set _num=1
)
)
if defined _num (
set "_num="
set num=!num!!n!
) else set "num="
if "!num!" neq "" if "!num:~10!" neq "" (
set _legal=
if "!num:~,1!"=="1" (
for %%i in (3,4,5,7,8) do (
if not defined _legal (
if "!num:~1,1!"=="%%i" set _legal=1
)
)
)
if defined _legal (
echo;!num!& set "num="
) else set num=!num:~1!
)
set line=!line:~1!
if "!line!" neq "" goto :split
goto :eofCOPY
人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

本帖最后由 taofan712 于 2017-2-10 13:49 编辑

回复 11# 回家路上

谢谢,你冷酷的言语下有火热的心啊,哈哈。我把你和zz100001的代码都保存下来慢慢看。没看完之前不提新问题了。



看了一天多了,到现在才看明白过程是怎样的再次感谢。另外,从这里的代码我突然明白“从上到下一直写到底更适合菜鸟阅读”这句话是错误的……

TOP

先findstr把有电话号码的行取出来啊。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

本帖最后由 GNU 于 2017-2-9 16:53 编辑
grep -Pow "\d{11}" "1.txt" > "2.txt"COPY
grep.exe 2.22 测试通过
http://bbs.bathome.net/s/tool/index.html?key=grep
1

评分人数

TOP

sed awk poweshell之类的应该就一行。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

返回列表