Регулярное выражение для анализа имени - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь найти два регулярных выражения для обработки имен (для таблицы стилей XSLT). Тот, который будет обрабатывать имя и, возможно, начальный, и тот, который захватит фамилию.

Имена всегда будут в этом формате + или минус средний инициал:

Джон В. Смит: бла, бла. или же Энн Смит: бла, бла.

Помощь

Ответы [ 4 ]

2 голосов
/ 09 декабря 2011

Это возможно в XPath 1.0 при условии:

  • Вы готовы принять довольно ужасные выражения XPath
  • Ваш формат действительно, на самом деле, полностью соответствует формату вы описали (смотрите ответ @ FailedDev и читайте " Программисты лжи верят в имена ")

Если вы согласны с обоими из них, то здесь мыgo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" method="text"/>
    <xsl:template match="/">
        <xsl:variable name="name" select="'  Ann: blah blah   '"/>
        <xsl:variable name="cname" 
                select="normalize-space(substring-before($name, ':'))"/>
        <xsl:variable name="after-first" 
                select="normalize-space(substring-after($cname, ' '))"/>
        <!-- first name -->
        [<xsl:value-of select="substring-before(concat($cname, ' '), ' ')"/>]
        <!-- middle name -->
        [<xsl:value-of select="concat(
            substring(substring-before($after-first, ' '), 1, 
                number(contains($after-first, ' ')) * 
                    string-length($after-first)),
            substring('', 1, 
                number(not(contains($after-first, ' '))) * 
                    string-length('')))"/>]
        <!-- last name -->
        [<xsl:value-of select="concat(
            substring(substring-after($after-first, ' '), 1, 
                number(contains($after-first, ' '))  * 
                    string-length($after-first)),
            substring($after-first, 1, 
                number(not(contains($after-first, ' '))) * 
                    string-length($after-first)))"/>]
    </xsl:template>
</xsl:stylesheet>

Использование:

<xsl:variable name="name" select="'  Ann  Q. Smith : blah blah   '"/>

Выход:

[Ann]
[Q.]
[Smith]

Использование:

<xsl:variable name="name" select="'  Ann  Smith : blah blah   '"/>

Выход:

[Ann]
[]
[Smith]

Использование:

<xsl:variable name="name" select="'  Ann: blah blah   '"/>

Вывод:

[Ann]
[]
[]
0 голосов
/ 08 декабря 2011

Если вы хотите строку имени, разделите строку до и после двоеточия. Тогда вы можете разделить его на пробелы. И.Е. {Джон К., Смит} и {Энн Смит}. Первый элемент всегда является первым именем, последний всегда является фамилией, и если имеется три элемента, второй элемент является начальным.

0 голосов
/ 09 декабря 2011

Если вы можете заставить его работать без RegEx - отлично. Если нет, то вот игла, которая мне подходит.

([A-Z][a-z]+\s([A-Z]\.\s)?[A-Z][a-z]+):

Вот пример скрипта на PHP.

<?php

$inp = "John Q. Smith: blah, blah. or Ann Smith: blah, blah.";
$needle = "/([A-Z][a-z]+\s([A-Z]\.\s)?[A-Z][a-z]+):/";

preg_match_all($needle, $inp, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    echo "I found $match[1]";
    if (array_key_exists(2, $match)) 
        echo " with a middle name of $match[2]";
    echo "\n";
}

?>

Даёт ...

Я нашел Джона К. Смита со вторым именем Q.
Я нашел Энн Смит

0 голосов
/ 08 декабря 2011

Если вы имеете в виду, что хотите получить часть перед двоеточием, вам не нужно регулярное выражение.Просто вызовите substring-before ().Только XSLT / XPath 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...