【问题标题】:JavaScript Using RegEx to Parse LastNameJavaScript 使用 RegEx 解析姓氏
【发布时间】:2017-01-13 13:04:05
【问题描述】:

我看到很多帖子——几乎——我需要的,我已经设法得到了——几乎——我需要的答案,但我需要一点帮助来获得最后一点。我想我对何时使用 .match 和何时使用 .replace 感到困惑。 (我可能已经在其他帖子中看到了答案,但没有说明如何应用它的上下文,我不认识它;它是对连字符的要求使这个问题变得有趣。)

我有一个如下所示的输入文本框 --

<input type="text" id="PatientLastName"
                 name="PatientLastName"
               onblur="FormatLastName('PatientLastName')"
                value="@Model.PatientLastName"
            maxlength="100" required />

onblur 函数是 --

function FormatLastName(textBoxID) {
     var someName = document.getElementById(textBoxID).value.toUpperCase();
     someName = $.trim(someName);
     var reName = /(([A-Z])+((\-?)([A-Z]*)*))/;
     var matches = someName.match(reName);
     var aName = matches[1];
     document.getElementById(textBoxID).value = aName;
}

我需要能够从任何输入中仅提取名称部分——例如,

9898s+m+_it????h-22324j4o5n4e0=s will give me SMITH-JONES

这是所需的输出。 (全部大写,唯一允许的特殊字符是字母之间只有一个连字符。像“O'Reilly”这样的名字会变成“OREILLY”。不支持非英文字符,也不支持重音符号。)

如果没有连字符,它也可以正常工作,例如

9898s+m+_it????h22324j4o5n4e0=s will give me SMITHJONES

但是对于——

9898s+m+_it????h-22324j4o5n4e0-=s will give me SMITH-

所以我猜我的分组或量词不太正确;也许我需要看更多的比赛?名字的脚本工作正常,但它基于 .replace - 我找不到让 .replace 与连字符一起使用的方法。

使用 .replace 的第一个名称版本是 --

function FormatFirstName(textBoxID) {
     var someName = document.getElementById(textBoxID).value.toUpperCase();
     someName = $.trim(someName);
     someName = someName.replace(/[^A-Z]/g, '');
     document.getElementById(textBoxID).value = someName;
}

感谢您的帮助。

--edit-- 我希望我没有因为包含 FirstName 函数而混淆事情。我把它放进去是为了显示在摆脱特殊字符和大写字母方面我可以到达我需要到达的地方——但它没有做我需要的模式匹配。替换看起来可能会给我留下一个尾随连字符,并且似乎没有过滤有多个连字符的情况。我需要 SMITH-JONES,SMITH--JONES 会是个问题,SMITH-也会-。

【问题讨论】:

  • @Toto -- 是的,这是一个很好的清单,但我正在记录患者姓名,他们更喜欢简化姓名。他们的一些系统很旧,如果您尝试输入其他类型的名称,它们会损坏。因此,即使开发人员知道名称可以有惊人的变化,这些最终用户的需求也很简单。这是一个满足客户要求的案例。

标签: javascript regex parsing names


【解决方案1】:

您是否尝试过类似的方法:

function FormatFirstName(textBoxID) {
    var someName = document.getElementById(textBoxID).value.toUpperCase();
    someName = $.trim(someName);
    someName = someName.replace(/[^A-Z\-]/g, '');
    document.getElementById(textBoxID).value = someName;
}

RegExp 中的\- 允许保留连字符。

【讨论】:

  • 是的,我确实认为这是一个选项,但这并不能阻止像“SMITH-”这样的东西,其中连字符是最后一个字符,而且看起来它不会阻止多个连字符,比如“史密斯-琼斯-伦蒂”。替换似乎是摆脱我不想要的字符的好方法,但无法弄清楚如何匹配名称的模式。
  • 您可以在正则表达式中添加-$ 以避免结束连字符。但我没有看到“双连字符”的任何简单解决方案。除了像someName.replace(/[^A-Z\-]|-$/g, '').replace(/--/g,'-');这样丑陋的东西@
  • 你能解释一下当输入是“SMITH-JONES-RENTY”时你不想得到什么吗?
  • 更正:使用someName.replace(/[^A-Z\-]|-*$/g, '').replace(/--/g,'-'); 替换所有结尾字形,如“SMITH----”
【解决方案2】:

您应该替换onblur 函数。我已经创建了一个示例供您查看

function getValue(){
  var value= arguments[0];
  value = value.replace(/[^a-zA-Z\-]*/g, "");
  console.log(value.toUpperCase());
}
&lt;input type="text" onblur="getValue(this.value)"/&gt;

在这种特殊情况下,请将您的函数更新为

function FormatFirstName(textBoxID) {
     var someName = document.getElementById(textBoxID).value.toUpperCase();
     someName = $.trim(someName);
     someName = someName.replace(/[^a-zA-Z\-]*/g, ''); 
     document.getElementById(textBoxID).value = someName.toUpperCase();
}

【讨论】:

  • @Faroog -- 感谢您提供“this”的示例。应该使用,我一直不清楚。当我使用“smith--jones--”测试该代码时,它在我寻找“SMITH-JONES”时返回“SMITH--JONES--”一个简单的替换看起来不能过滤掉多个连字符或防止尾随连字符。解析名字时没有问题,但不适用于姓氏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多