Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите составить шаблон рег. выражений
 
 автор: lucifer   (03.11.2010 в 18:25)   письмо автору
 
 

Исходная строка содержит сведения о человеке: фамилию, инициалы, год рождения, рост в см.
Эти сведения расположены в произвольном порядке, отделены друг от друга пробелами. На-
пример:
Иванов И.И. 1976 187
И.И. Иванов 187 1976
187 И.И. 1976 Иванов и т.п.
в результате нужно получить строку в таком виде
Иванов И.И. 1976 187

я пробовал так
[^\s]+)\s([^\s]+)\s([\d]+)\s([\d]+ но это не уневерсальная запись
если будет так
187 И.И. 1976 Иванов или так
187 1976 И.И. Иванов, то выражение не отработает

  Ответить  
 
 автор: heed   (04.11.2010 в 09:05)   письмо автору
 
   для: lucifer   (03.11.2010 в 18:25)
 

\S+\s не особо разбирается имена там фамилии или чего-то ещё.
нужно понять какие обязательные отличия имеются во фрагментах, и имеются-ли такие вообще.

если И.И. имя и отчество или наоборот отчество и имя ?
если Иваноc И. Иванович , то где фамилия?
если в весе (или там рост) больше цифр чем в годе рождения (или там не год) ?

  Ответить  
 
 автор: lucifer   (04.11.2010 в 12:20)   письмо автору
 
   для: heed   (04.11.2010 в 09:05)
 

там не будет отчество будут только инициалы и фамилия, в инициалах присутствует точки, рост 3-х значная цифра, год 4

  Ответить  
 
 автор: sim5   (04.11.2010 в 12:28)   письмо автору
 
   для: lucifer   (04.11.2010 в 12:20)
 

<?
$s 
= array("Иванов И.И. 1976 187",
  
"И.И. Иванов 187 1976",
  
"187 И.И. 1976 Иванов");

foreach(
$s as $v){
  
$v explode(" "$v);
  
rsort($v);
  echo 
implode(" "$v) . "<br>";
}

  Ответить  
 
 автор: lucifer   (04.11.2010 в 13:32)   письмо автору
 
   для: sim5   (04.11.2010 в 12:28)
 

не совсем понял зачем мне этот код )
программа будет написана на delphi, мне именно нужен шаблон регулярки

  Ответить  
 
 автор: sim5   (04.11.2010 в 13:34)   письмо автору
 
   для: lucifer   (04.11.2010 в 13:32)
 

А вы думаете мне очень понятно было, что вы спрашиваете именно для Delphi? А этот код без всяких регулярок (что быстрее) выполняет необходимое.

  Ответить  
 
 автор: lucifer   (04.11.2010 в 13:46)   письмо автору
 
   для: sim5   (04.11.2010 в 13:34)
 

если бы нужно было просто разбить предложение на слова я бы не заморачивался с RegEx
но тут важен порядок, на выход нужно получить такую строку
Иванов И.И. 1976 года рождения имеет рост 187 см.
и не важно в каком порядки строка передается для обработки

  Ответить  
 
 автор: sim5   (04.11.2010 в 13:58)   письмо автору
 
   для: lucifer   (04.11.2010 в 13:46)
 

Если вы занимаетесь не только Delphi, но и веб программированием (а этот форум именно этих "мужиков"), а также у вас имеется локальный сервер, то запустив вышеприведенный код вы получите:
Иванов И.И. 1976 187
Иванов И.И. 1976 187
Иванов И.И. 1976 187
Это к тому, что вам все равно придется приводить к порядку полученные данные, а каким образом они полученные, это не так важно. Обратная сортировка полученного массива как раз вам даст почти то, что вам и надо. Единственно что останется еще сделать, так это проверить "инициалы или фамилие", так как, например, Ю.М. Фамилие, уже никак не даст при простой обратной сортировке Фамилие Ю.М.

  Ответить  
 
 автор: kosta_in_net   (30.11.2010 в 02:44)   письмо автору
 
   для: lucifer   (04.11.2010 в 13:46)
 

я думаю, что гемороиться единой регуляркой не стоит. Можно сделать так (аналог для делфи сделайте сами):
<? 
$s 
= array("187 И.И. 2976 Иванов"
  
"187 2976 И.И. Петров"
  
"Сидоров И.И. 2976 187",
  
"187 И.И. 2976 Сим5",
  
"И.И. Люцифер 187 2976"); 

$nev=array();
$a=count($s);
for(
$i=0;$i<$a;$i++){ 
  
preg_match("/\b\d{3}\b/i"$s[$i], $nev[$i]['rost']); 
  
preg_match("/\b\d{4}\b/i"$s[$i], $nev[$i]['god']); 
  
preg_match("/[а-я]{2,}/i"$s[$i], $nev[$i]['family']); 
  
preg_match("/[а-я]{1}\.[а-я]{1}\./i"$s[$i], $nev[$i]['inicialy']); 
}

?>


В результате многомерный массив $nev имеет отсортированные данные:
Array
(
[rost] => Array
(
[0] => 187
)

[god] => Array
(
[0] => 2976
)

[family] => Array
(
[0] => Иванов
)

[inicialy] => Array
(
[0] => И.И.
)

)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования