проблема с этим reg-выражением

#php #regex

#php #регулярное выражение

Вопрос:

У меня странная проблема с 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
  

Комментарии:

1. если текст до названия продукта всегда состоит из фиксированного количества символов (как это видно в ваших примерах), вам нужно только название продукта, не используйте регулярное выражение

2. это регулярное выражение представляет собой беспорядок. какая часть этой строки может измениться?

3. Вы могли бы получить больше ответов, если бы потратили время на такие мелочи, как написание заглавных букв «I» и написание слов полностью.

4. Почему у вас есть круглые скобки вокруг всех неважных / неизменяемых элементов? Они вам не нужны.

5. Вы уверены, что правильно разместили свое регулярное выражение? Оно вообще не должно совпадать из-за всех этих удвоенных обратных косых черт…

Ответ №1:

Это выражение будет фиксировать название вашего продукта:

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

Я предполагаю, что #T55.08 #J60.91 #M1/1 #YT102/0/// и #G никогда не меняются.

Комментарии:

1. Я бы заменил (.*) на (.*?)s* , чтобы пропустить пробел, но в остальном все хорошо.

2. спасибо, у меня есть много других строк, таких как #T56.38 #J80.60 и т.д. И т.п., Поэтому мне нужно проверить даже первую часть. итак, это решение идеально!

3. @Matteo, к вашему сведению, это решение работает, только если первая часть строки никогда не меняется , что противоречит тому, как вы только что прокомментировали.

4. У меня есть много других строк для проверки этого с помощью regex, и мне нужно получить название продукта, только если строка начинается с #T55.08 J60.91 и т.д. И т.п., Если строка начинается с других чисел, мне не нужно получать название продукта. Спасибо

Ответ №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 будет выполняться намного быстрее, чем a preg_match или preg_replace .

Ответ №3:

Мне кажется, что строка находится в заданном формате, с # на каждом конце строки и полями внутри строки, разделенными косой чертой.

И, предположительно, вы знаете, что название продукта всегда будет находиться в одной и той же позиции поля в этом формате?

В этом случае вам вообще не нужно использовать регулярное выражение (конечно, не такое ужасающе сложное, как то, которое вы придумали!). Вы могли бы просто отрезать начальные и третичные # символы и разбить строку на косую черту, а затем выбрать соответствующий элемент из результирующего массива:

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

Ответ №4:

Если название продукта всегда имеет префикс /// , вы могли бы использовать:

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

название продукта будет в $matches[1]

Ответ №5:

Если вам нужно просто название продукта, вы можете использовать это регулярное выражение:

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

Однако, если начальная часть вашей строки (т. Е. все до /// ) исправлена, вы можете просто использовать подстроки.

Ответ №6:

Это действительно выглядит слишком сложным. Если вам нужно просто название продукта, вы могли бы использовать:

 ////(.*)#G$/