PHP регулярное выражение для сопоставления строк с заглавными буквами и случайными дефисами - PullRequest
1 голос
/ 20 апреля 2010

Я пытаюсь преобразовать существующее регулярное выражение PHP, чтобы применить его к немного другому стилю документа.

Вот оригинальный стиль документа:

**FOODS - TYPE A** 
___________________________________ 
**PRODUCT** 
1) Mi Pueblito Queso Fresco Authentic Mexican Style Fresh Cheese; 
2) La Fe String Cheese 
**CODE** 
Sell by date going back to February 1, 2009 

И успешно работающий код соответствия PHP Regex, который возвращает «true», только если строка окружена звездочками, и сохраняет каждую сторону «-» как $ m [1] и $ m [2] соответственно.

 if ( preg_match('#^\*\*([^-]+)(?:-(.*))?\*\*$#', $line, $m) ) { 
    // only for **header - subheader** $m[2] is set. 
    if ( isset($m[2]) ) { 
      return array(TYPE_HEADER, array(trim($m[1]), trim($m[2]))); 
    } 
    else { 
      return array(TYPE_KEY, array($m[1])); 
    } 
  } 

Итак, для строки 1: $ m [1] = "FOODS" AND $ m [2] = "TYPE A"; Строка 2 будет пропущена; Строка 3: $ m [1] = "ПРОДУКТ" и т. Д.

Вопрос: Как бы я переписал приведенное выше совпадение с регулярным выражением, если бы заголовки не имели звездочки, но все еще имели заглавные буквы и содержали не менее 4 символов долго? Например:

FOODS - TYPE A 
___________________________________ 
PRODUCT
1) Mi Pueblito Queso Fresco Authentic Mexican Style Fresh Cheese; 
2) La Fe String Cheese 
CODE
Sell by date going back to February 1, 2009 

Спасибо.

Ответы [ 4 ]

2 голосов
/ 20 апреля 2010

Вдоль строк (не забывайте флаг "u" для регулярных выражений Юникода):

^(?:\*\*)?(?=[^*]{4,})(\p{Lu}+)(?:\s*-\s*(\p{Lu}+))?(?:\*\*)?\s*$
^               # start of line
(?:\*\*)?       # two stars, optional
(?=[^*]{4,})    # followed by at least 4 non-star characters
(\p{Lu}+)       # group 1, Unicode upper case letters
(?:             # start no capture group
  \s*-\s*       #   space*, dash, space*
  (\p{Lu}+)     #   group 2, Inicode upper case letters
)?              # end no capture group, make optional
(?:\*\*)?       # two stars, optional
\s*             # optional trailing spaces
$               # end of line

РЕДАКТИРОВАТЬ: упрощено, согласно комментариям:

^(?=[A-Z ]{4,})([A-Z ]+)(?:-([A-Z ]+))?\s*$
^               # start of line
(?=[A-Z -]{4,}) # followed by at least 4 upper case characters, spaces or dashes
([A-Z ]+)       # group 1, upper case letters or space
(?:             # start no capture group
  -             #   a dash
  ([A-Z ]+)     #   group 2, upper case letters or space
)?              # end no capture group, make optional
\s*             # optional trailing spaces
$               # end of line

Содержимое групп 1 и 2 должно быть обрезано перед использованием.

1 голос
/ 20 апреля 2010

Регулярное выражение:

^(?=.{4})([^-]+)(?:-(.*))?$

Объяснение:

^          # start of line
(?=.{4})   # look ahead to make sure there are at least 4 characters
([^-]+)    # get all characters until it finds a dash character, if there is any
(?:-(.*))? # optional: skip the dash and continue get all characters until EOL
$          # end of line

Я предположил, что вас интересуют только строки, содержащие не менее 4 символов.

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

^(?=.{4})([A-Z\s]+)(?:-([A-Z\s]+))?$
1 голос
/ 20 апреля 2010
^([A-Z]{4,}(?:[A-Z ]*[A-Z])?)(?:\s*-\s*([A-Z]{4,}(?:[A-Z ]*)?))?$

А как насчет этого? Он будет соответствовать заглавным словам длиной не менее 4 символов и дополнительному подзаголовку, который будет содержать не менее 4 заглавных букв.

0 голосов
/ 20 апреля 2010

Итак, все, что вам нужно знать, это то, что заголовок начинается с четырех заглавных букв ASCII? Это должно работать:

'#^([A-Z]{4}[^-]*)(?:-(.*))?$#'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...