请教一个正则表达式问题


厂家提供的货品明细表,类似于下面这种格式:
佳洁士强根固齿牙膏90克
佳洁士健康专家全优7效牙膏140克
佳洁士草本水晶牙膏(清爽薄荷香型)105克
佳洁士劲爽清新漱口水250mL
现在想匹配克数前面的文字,例如第一行想匹配“佳洁士强根固齿牙膏”,现在用的是这样的正则:
\w+(?=\d+克)
但是过滤出来的是"佳洁士强根固齿牙膏9",也就是说零宽断言中 \d+ 只匹配了一个数字0,头疼中。
刚学正则,请教下是哪地方不对?


感谢大家的耐心回答!
补充下问题,我是看的正则表达式30分钟入门教程,用的是作者自己写的 正则工具 ,也就是.net中的正则。
货品明细是一个excel表,现在要把上面的信息拆成2列,一列是品名“佳洁士强根固齿牙膏”,一列是规格“90克”,先想用vba来拆,但是现学vba时间来不及了,个人比较熟悉php。
上面朋友说直接匹配 \d+克 然后替换成空字符串,我提取品名时就是这样做的;现在我的思路是反向匹配品名然后替换成空字符串,就得到规格了,折腾不出来。
不知道有没有好的办法能把两个分开。
汗,转成excel问题了。。。


已经用vba+正则解决了,话说vba的语法还是挺简单的,因为熟悉PHP,所以采纳了用PHP的朋友的答案,谢谢各位的耐心回答!

正则表达式

我喝鲜橙多 9 years, 7 months ago

可以参考这个问题

http://segmentfault.com/q/1010000002619998/a-1020000002620331


如果是excel的问题的话 建议到ExcelHome看看

http://club.excelhome.net/thread-823682-1-1.html

比较简单快捷的解决办法

把内容复制到文本编辑器中(notepad) 用 \d+克|\d+mL 替换掉所有结尾的规格

之后复制回excel的另一列 在c列使用 =right(a1, lenb(a1) - lenb(b1)) 函数即可

阿年1989 answered 9 years, 7 months ago

这个问题几乎可以用excel公式做出来
假设货品列是A
首先在B列输入公式 =MIN(FIND({0,1,2,3,4,5,6,7,8,9},A1&"0123456789"))-1
这个公式的作用是在货品明细找到第一个数字的位置
然后分别两列left(A1,B1), right(A1,Len(A1)-B1)就可以从数字位置拆分为两列。

缺点是处理不了品名中有数字的情况,比如 全优7效牙膏140克 -> 全优,7效牙膏140克
优点是只需要excel自身即可,不需要其它工具和步骤。
如果品名中数字情况不多,可以考虑先替换为汉字,拆分两列按值copy出来以后,再把商品名的汉字替换回来。

黎明小黑点 answered 9 years, 7 months ago

感觉还是匹配xx克或者xxmL这样比较好,如果模式都是数字加"克,千克,ml"之类的。例如在js中的结果:
图片描述

大脸兔喷喷 answered 9 years, 7 months ago

因为数字是包含在 \w 范围内的,然后你又是用 \w+ 进行的贪婪匹配,正则会匹配 尽量多 的字符

改成非贪婪匹配 \w+? 应该就行了

不过话说回来刚刚试的时候好像php和js里面 \w 都是不包括中文的,我用的 . 做的测试

夜丶暮色倾城_ answered 9 years, 7 months ago

\d+克 匹配上最后的部分(90克,140克), 然后把这部分替换成""就能得到你想要的了。

\w是不能匹配中文的

混合型巧克力 answered 9 years, 7 months ago

不知道你的语言,不过 你可以试下改成


 \w+?(?=\d+克)

雪ノ下・雪乃 answered 9 years, 7 months ago


 string input = "佳洁士强根固齿牙膏90克";
            Regex reg = new Regex(@"(?<val>\d+)克");
            Console.WriteLine(reg.Match(input).Groups["val"].Value);
            //out put 90;

你要什么编程语言的?

上面的眼瞎了,不好意思。


 string input ="佳洁士强根固齿牙膏90克";
            Regex reg = new Regex(@"(\d+克$)");
            Console.WriteLine(reg.Replace(input,""));
            //out put:佳洁士强根固齿牙膏

蓝白条胖次 answered 9 years, 7 months ago

以php代码为例:


 <?php

$arr = [];
$arr[] = '佳洁士强根固齿牙膏90克';
$arr[] = '佳洁士强根固齿牙膏140克';
$arr[] = '佳洁士草本水晶牙膏(清爽薄荷香型)105克';

foreach($arr as $str){
    preg_match('/([^0-9]+)\d+克/', $str, $match);
    var_dump($match);
}

输出结果为:


 array(2) {
  [0]=>
  string(32) "佳洁士强根固齿牙膏90克"
  [1]=>
  string(27) "佳洁士强根固齿牙膏"
}
array(2) {
  [0]=>
  string(33) "佳洁士强根固齿牙膏140克"
  [1]=>
  string(27) "佳洁士强根固齿牙膏"
}
array(2) {
  [0]=>
  string(53) "佳洁士草本水晶牙膏(清爽薄荷香型)105克"
  [1]=>
  string(47) "佳洁士草本水晶牙膏(清爽薄荷香型)"
}

是不是你要的?

huangna answered 9 years, 7 months ago

Your Answer