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


  1. echo "*电子类*   *电阻01*    *贴片    0805*   *电阻  IDN101620050250*"|awk 'BEGIN{RS="\\* +\\*"}$0!~/IDN/{gsub(/^*/,"");print}'
复制代码

输出:
电子类
电阻01
贴片    0805

  1. 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:
  1. 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