|
|
|
| Исходная строка содержит сведения о человеке: фамилию, инициалы, год рождения, рост в см.
Эти сведения расположены в произвольном порядке, отделены друг от друга пробелами. На-
пример:
Иванов И.И. 1976 187
И.И. Иванов 187 1976
187 И.И. 1976 Иванов и т.п.
в результате нужно получить строку в таком виде
Иванов И.И. 1976 187
я пробовал так
[^\s]+)\s([^\s]+)\s([\d]+)\s([\d]+ но это не уневерсальная запись
если будет так
187 И.И. 1976 Иванов или так
187 1976 И.И. Иванов, то выражение не отработает | |
|
|
|
|
|
|
|
для: lucifer
(03.11.2010 в 18:25)
| | \S+\s не особо разбирается имена там фамилии или чего-то ещё.
нужно понять какие обязательные отличия имеются во фрагментах, и имеются-ли такие вообще.
если И.И. имя и отчество или наоборот отчество и имя ?
если Иваноc И. Иванович , то где фамилия?
если в весе (или там рост) больше цифр чем в годе рождения (или там не год) ? | |
|
|
|
|
|
|
|
для: heed
(04.11.2010 в 09:05)
| | там не будет отчество будут только инициалы и фамилия, в инициалах присутствует точки, рост 3-х значная цифра, год 4 | |
|
|
|
|
|
|
|
для: 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>";
}
|
| |
|
|
|
|
|
|
|
для: sim5
(04.11.2010 в 12:28)
| | не совсем понял зачем мне этот код )
программа будет написана на delphi, мне именно нужен шаблон регулярки | |
|
|
|
|
|
|
|
для: lucifer
(04.11.2010 в 13:32)
| | А вы думаете мне очень понятно было, что вы спрашиваете именно для Delphi? А этот код без всяких регулярок (что быстрее) выполняет необходимое. | |
|
|
|
|
|
|
|
для: sim5
(04.11.2010 в 13:34)
| | если бы нужно было просто разбить предложение на слова я бы не заморачивался с RegEx
но тут важен порядок, на выход нужно получить такую строку
Иванов И.И. 1976 года рождения имеет рост 187 см.
и не важно в каком порядки строка передается для обработки | |
|
|
|
|
|
|
|
для: lucifer
(04.11.2010 в 13:46)
| | Если вы занимаетесь не только Delphi, но и веб программированием (а этот форум именно этих "мужиков"), а также у вас имеется локальный сервер, то запустив вышеприведенный код вы получите:
Иванов И.И. 1976 187
Иванов И.И. 1976 187
Иванов И.И. 1976 187
| Это к тому, что вам все равно придется приводить к порядку полученные данные, а каким образом они полученные, это не так важно. Обратная сортировка полученного массива как раз вам даст почти то, что вам и надо. Единственно что останется еще сделать, так это проверить "инициалы или фамилие", так как, например, Ю.М. Фамилие, уже никак не даст при простой обратной сортировке Фамилие Ю.М. | |
|
|
|
|
|
|
|
для: 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] => И.И.
)
) | |
|
|
|