亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 【已解決】求個正則表達式 [打印本頁]

作者: cfwyy    時間: 2017-11-28 16:12
標題: 【已解決】求個正則表達式
本帖最后由 cfwyy 于 2019-06-11 08:45 編輯

有個字符提取的需求,想用正則做,但正則學的還不到家,看能不能向壇子里的大神求一個。
有一串文本:

*電子類*   *電阻01*    *貼片    0805*   *電阻  IDN101620050250*   

想用兩個正則分別提取兩種  *號之間的 文本,*號間可能出現(xiàn)的字符是漢字, 英文字母, 數(shù)字, 空格:

1. *號間 沒有 “IDN.”這一串的,  其中IDN是固定的,后面是12個數(shù)字。

結(jié)果如:
電子類
電阻01
貼片    0805

2. *號間 有 “IDN.”這一串的
結(jié)果如:
電阻  IDN101620050250



這種 我會寫   \*[\w\u4e00-\u9fa5\x20]+IDN\d{12}\*  
但第一種我不會,不知道 怎么把有 IDN... 這樣特定的給排除掉。

看大神們能不能賜個第一種的正則 或教個思路,謝謝!

作者: cfwyy    時間: 2017-11-28 16:17
第一次發(fā)帖,我的注冊時間怎么是 unix 元年啊 哈哈,雖然這個賬號注冊了也應該有好幾年了。
作者: jason680    時間: 2017-11-28 16:18
回復 1# cfwyy

方法很多,接下來要做什么?
作者: cfwyy    時間: 2017-11-28 16:34
回復 3# jason680

接下來 很有可能是要 換個存儲方式,內(nèi)容寫到access數(shù)據(jù)庫 或者 寫到XML  文件  還沒確定好。
我現(xiàn)在的想法是 把 前面的類和小類   和后面具體的條目分別提取出來再說,請大神賜教一下,謝謝!

作者: 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://72891.cn/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前面匹配的內(nèi)容會丟掉,最后的結(jié)果就是從\K后面開始。

作者: 本友會機友會攝友會    時間: 2019-06-05 13:20
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 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://72891.cn/) Powered by Discuz! X3.2