请教一个正则表达式问题
厂家提供的货品明细表,类似于下面这种格式:
佳洁士强根固齿牙膏90克
佳洁士健康专家全优7效牙膏140克
佳洁士草本水晶牙膏(清爽薄荷香型)105克
佳洁士劲爽清新漱口水250mL
现在想匹配克数前面的文字,例如第一行想匹配“佳洁士强根固齿牙膏”,现在用的是这样的正则:
\w+(?=\d+克)
但是过滤出来的是"佳洁士强根固齿牙膏9",也就是说零宽断言中 \d+ 只匹配了一个数字0,头疼中。
刚学正则,请教下是哪地方不对?
感谢大家的耐心回答!
补充下问题,我是看的正则表达式30分钟入门教程,用的是作者自己写的
正则工具
,也就是.net中的正则。
货品明细是一个excel表,现在要把上面的信息拆成2列,一列是品名“佳洁士强根固齿牙膏”,一列是规格“90克”,先想用vba来拆,但是现学vba时间来不及了,个人比较熟悉php。
上面朋友说直接匹配 \d+克 然后替换成空字符串,我提取品名时就是这样做的;现在我的思路是反向匹配品名然后替换成空字符串,就得到规格了,折腾不出来。
不知道有没有好的办法能把两个分开。
汗,转成excel问题了。。。
已经用vba+正则解决了,话说vba的语法还是挺简单的,因为熟悉PHP,所以采纳了用PHP的朋友的答案,谢谢各位的耐心回答!
Answers
可以参考这个问题
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))
函数即可
这个问题几乎可以用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出来以后,再把商品名的汉字替换回来。
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:佳洁士强根固齿牙膏
以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) "佳洁士草本水晶牙膏(清爽薄荷香型)"
}
是不是你要的?