我对reg表达式有一个奇怪的问题。
我正在尝试以类似这样的字符串取出产品的名称
#T55.08 #J60.91 #M1/1 #YT102/0///Tie #G
#T55.08 #J60.91 #M1/1 #YT102/0///Foulard #G
#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief #G
我正在使用tx2re(http://txt2re.com)创建reg表达式但似乎如果产品名称少于4个字符,则reg exp不起作用... 你能帮帮我吗?
这是我的正则表达式
/(#)(T)(55\\.08)( )(#)(J)(60\\.91)( )(#)(M)(1)(\\/1)( )(#)(YT)(102)(\\/0)(\\/)(\\/)(\\/)((?:[a-z][a-z]+))(.)((?:[a-z][a-z]+))/is
答案 0 :(得分:4)
此表达式将捕获产品的名称:
/#RT55\.08 #J60\.91 #M1\/1 #YT102\/0\/\/\/(.*)#G/
我认为#T55.08 #J60.91 #M1/1 #YT102/0///
和#G
永远不会改变。
答案 1 :(得分:2)
您不需要使用正则表达式解决此问题。如果第一个段始终保持不变,
$string = "#T55.08 #J60.91 #M1/1 #YT102/0///Pocket handkerchief #G";
$title = trim(substr($string, 33, -2));
或者如果它总是在///
之后:
$title = trim(substr($string, strpos($string,'///')+3, -2));
此外,substr
的运行速度远远超过preg_match
或preg_replace
。
答案 2 :(得分:1)
在我看来,字符串是给定格式的,行的每一端都有#
,而用斜线分隔的行中的字段。
并且可能您知道产品名称将始终以该格式位于相同的字段位置?
在这种情况下,你根本不需要使用正则表达式(当然不是一个像你提出的那样复杂的复杂!)。您可以删除前导和临时#
字符并使用斜杠爆炸字符串,并从结果数组中选择适当的元素:
$inputrow = trim($inputrow,'#');
$fields = explode('/',$inputrow);
$product_name = trim($fields[5]);
答案 3 :(得分:1)
如果产品名称始终以///
作为前缀,则可以使用:
preg_match('~///(.+?)\s*#G$~', $string, $matches);
产品名称将位于$matches[1]
答案 4 :(得分:0)
如果您只想要产品名称,可以使用此正则表达式:
.*?\/\/\/(.*?)#G
但是,如果字符串的初始部分(即///
之前的所有内容)都已修复,则只需使用子字符串即可。
答案 5 :(得分:0)
这看起来真的很复杂。如果您只需要产品名称,则可以使用:
/\/\/\/(.*)#G$/