【问题标题】:Regex for parsing name用于解析名称的正则表达式
【发布时间】:2011-12-08 19:46:47
【问题描述】:

我正在尝试提出两个正则表达式来处理名称(用于 XSLT 样式表)。一个会处理名字,也可能是首字母,一个会抓取姓氏。

名称将始终采用这种格式 + 或减去中间的首字母:

约翰·Q·史密斯:废话,废话。 或者 安·史密斯:废话,废话。

帮助?

【问题讨论】:

  • 因此,在英语中,模式是“一个以大写开头的单词;一个空格可选地后跟一个大写字母和一个句点;一个空格和另一个以大写开头的单词-大小写字母,以冒号结尾。”对吗?
  • 是的。我现在可以通过下面提到的 Xpath 中的 substring-before() 调用来获取姓氏。还是不知道怎么处理第一个。
  • 这不只是获取姓氏,它还会获取冒号之前的所有内容,包括姓氏。
  • 人们有名字、姓氏,可能还有中间名首字母的想法是无稽之谈。如果你想把人们放在鸽子洞里,并将他们的身份降低到(编程错误的)计算机可以处理的程度,那就给他们一个数字。

标签: regex xslt


【解决方案1】:

这在 XPath 1.0 中是可能的,假设:

如果你对这两个都没问题,那么我们开始吧:

<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]
[]
[]

【讨论】:

    【解决方案2】:

    如果您的意思是想要冒号之前的部分,则不需要正则表达式。只需调用 substring-before()。不过,仅限 XSLT/XPath 2。

    【讨论】:

    • 太棒了,这给了我姓氏。现在我需要第一个,也可能是第一个!谢谢!
    • 嗯,实际上,这给了我整个名称字符串,直到“:”,我想要冒号之前的特定单词。
    【解决方案3】:

    如果需要名称字符串,请在冒号前后拆分字符串。然后你可以用空格分割它。 IE。 {John, Q., Smith} 和 {Ann, Smith}。第一个元素始终是名字,最后一个始终是姓氏,如果有三个元素,则第二个元素是首字母。

    【讨论】:

      【解决方案4】:

      如果你可以让它在没有 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";
      }
      
      ?>
      

      它给...

      我发现 John Q. Smith 的中间名是 Q。
      我找到了安·史密斯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 2011-06-28
        • 2022-01-25
        • 1970-01-01
        • 2013-12-31
        相关资源
        最近更新 更多