2011-05-17 36 views
1

reg表达式有一个奇怪的问题。此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 
+5

如果文本到产品名称是始终字符固定数量的(因为它似乎是你的样品中),你只需要在产品名称,不要”不要使用a正则表达式 – Mat 2011-05-17 14:31:03

+1

表示正则表达式是一团糟。该字符串的哪部分可以更改? – Kelly 2011-05-17 14:32:23

+0

如果你花时间做一些小事情,比如大写“我”,并且写出完整的单词,你可能会得到更多的答复。 – 2011-05-17 14:35:20

回答

4

这个表达式将捕获你的产品的名称:

/#RT55\.08 #J60\.91 #M1\/1 #YT102\/0\/\/\/(.*)#G/ 

我认为#T55.08 #J60.91 #M1/1 #YT102/0///#G永远不会改变。

+1

我会用'(。*)'替换'(。*)'。 )\ s *'跳过空格,但是否则很好。 – 2011-05-17 14:39:32

+0

谢谢,我有很多其他字符串像#T56.38#J80.60等等,所以我需要检查甚至第一部分。所以这个解决方案很完美! – Matteo 2011-05-17 14:47:41

+0

@Matteo,仅供参考,此解决方案仅适用于字符串*的第一部分永远不会更改*的情况,这与您刚刚评论的方式相反。 – Kelly 2011-05-17 14:59:12

0

如果你只是想要的产品的名称,你可以使用这个表达式:

.*?\/\/\/(.*?)#G 

但是,如果你的字符串(即一切都交给///)的初始部分是固定的,你可以简单地使用子。

0

这看起来过于复杂。如果你只需要产品的名称,你可以使用:

/\/\/\/(.*)#G$/ 
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_matchpreg_replace快得多。

1

它看起来像字符串是给定的格式,在行的每一端有#,行内的字段由斜线分隔。

据推测,您知道产品名称将始终处于该格式的相同字段位置?

在这种情况下,你根本不需要使用正则表达式(当然,并不是像你想出的那样复杂)。你可以只砍掉领导和treailing #人物和爆炸被斜线的字符串,从结果数组挑选出合适的元素:

$inputrow = trim($inputrow,'#'); 
$fields = explode('/',$inputrow); 
$product_name = trim($fields[5]); 
1

如果产品名称是始终///前缀你可以使用:

preg_match('~///(.+?)\s*#G$~', $string, $matches); 

产品名称将在$matches[1]