【发布时间】: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