Chinaunix
标题:
【已解决】求个正则表达式
[打印本页]
作者:
cfwyy
时间:
2017-11-28 16:12
标题:
【已解决】求个正则表达式
本帖最后由 cfwyy 于 2019-06-11 08:45 编辑
有个字符提取的需求,想用正则做,但正则学的还不到家,看能不能向坛子里的大神求一个。
有一串文本:
*电子类* *电阻01* *贴片 0805* *电阻 IDN101620050250*
想用两个正则分别提取两种 *号之间的 文本,*号间可能出现的字符是汉字, 英文字母, 数字, 空格:
1. *号间 没有 “IDN.”这一串的, 其中IDN是固定的,后面是12个数字。
结果如:
电子类
电阻01
贴片 0805
2. *号间 有 “IDN.”这一串的
结果如:
电阻 IDN101620050250
这种 我会写 \*[\w\u4e00-\u9fa5\x20]+IDN\d{12}\*
但第一种我不会,不知道 怎么把有 IDN... 这样特定的给排除掉。
看大神们能不能赐个第一种的正则 或教个思路,谢谢!
作者:
cfwyy
时间:
2017-11-28 16:17
第一次发帖,我的注册时间怎么是 unix 元年啊 哈哈,虽然这个账号注册了也应该有好几年了。
作者:
jason680
时间:
2017-11-28 16:18
回复
1#
cfwyy
方法很多,接下来要做什么?
作者:
cfwyy
时间:
2017-11-28 16:34
回复
3#
jason680
接下来 很有可能是要 换个存储方式,内容写到access数据库 或者 写到XML 文件 还没确定好。
我现在的想法是 把 前面的类和小类 和后面具体的条目分别提取出来再说,请大神赐教一下,谢谢!
作者:
jason680
时间:
2017-11-28 18:05
本帖最后由 jason680 于 2017-11-28 18:18 编辑
回复
4#
cfwyy
$ awk -F'\\*' '{for(n=2;n<NF;n+=2)if(
$n!~/IDN/
)print $n}' FILE
电子类
电阻01
贴片 0805
$ awk -F'\\*' '{for(n=2;n<NF;n+=2)if(
$n~/IDN/
)print $n}' FILE
电阻 IDN101620050250
作者:
wh7211
时间:
2017-11-28 21:23
回复
1#
cfwyy
echo "*电子类* *电阻01* *贴片 0805* *电阻 IDN101620050250*"|awk 'BEGIN{RS="\\* +\\*"}$0!~/IDN/{gsub(/^*/,"");print}'
复制代码
输出:
电子类
电阻01
贴片 0805
echo "*电子类* *电阻01* *贴片 0805* *电阻 IDN101620050250*"|awk 'BEGIN{RS="\\* +\\*"}/IDN/{gsub(/*.*$/,"");print}'
复制代码
输出:
电阻 IDN101620050250
作者:
cfwyy
时间:
2017-11-29 09:17
回复
5#
jason680
谢谢!可以用!不用awk, 只用单纯的正则表达式 可以匹配吗?
作者:
cfwyy
时间:
2017-11-29 09:19
回复
6#
wh7211
谢谢!好用的。如不用awk 只用单纯正则 可以匹配出来吗?
作者:
1cpuer
时间:
2017-11-29 13:04
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=572121
作者:
wh7211
时间:
2017-11-29 17:06
回复
8#
cfwyy
可以,用PCRE:
echo "*电子类* *电阻01* *贴片 0805* *电阻 IDN101620050250*"|grep -Po '(^| +)\*\K[^A-Z\*]+(?=\*)'
复制代码
输出:
电子类
电阻01
贴片 0805
作者:
1cpuer
时间:
2019-06-03 07:08
echo "*电子类* *电阻01* *贴片 0805* *电阻 IDN101620050250*"|grep -Po '(^| +)\*\K[^A-Z\*]+(?=\*)
\K 是什么,我也不知道。
作者:
cfwyy
时间:
2019-06-04 08:50
回复
11#
1cpuer
怎么把我的老贴子翻出来了
\K 是PCRE的用法,表示重置匹配的开始位置,就是说\K前面匹配的内容会丢掉,最后的结果就是从\K后面开始。
作者:
本友会机友会摄友会
时间:
2019-06-05 13:20
提示:
作者被禁止或删除 内容自动屏蔽
作者:
csccyab
时间:
2019-06-10 17:12
本帖最后由 csccyab 于 2019-06-11 13:57 编辑
$ echo '*电子类* *电阻01* *贴片 0805* *电阻 IDN101620050250*' | grep -Po '(?<=\*)(?!\s)+((?!IDN)[\p{Han}\w\s])+(?=\*)'
电子类
电阻01
贴片 0805
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2