我试图从多行字符串中提取名字和/或姓氏,并且无法使正则表达式起作用。
字符串有时只包含名字,有时也存在姓氏。
以下字符串应成为:" John Doe"
"
<a>Customer: John Doe</a>
"
并且以下字符串应该变为:&#34; John&#34;
"
<a>Customer: John</a>
"
答案 0 :(得分:2)
好的,我正在考虑你的字符串中的以下假设,这个答案基于这些假设:
1)始终字符串包含此模式Cutomer:SOME_NAME 2)SOME_NAME将始终包含一些字符,但不包含特殊字符。 3)您想在“Customer”字符串后提取整个名称。 4)名称最多两个字长。如果name可以包含任意数量的单词,则需要进行一些修改。
解决方案:
var regEx = /.*Customer:\s?(\w*\s?\w*)\s?.*$/
var myStr = "<a>Customer: John Doe</a>";
var output = myStr.replace(regEx,'$1');
现在,输出包含字符串'John Doe'
请记住在应用regEx操作之前修剪主字符串。
将尝试在此处添加jsfiddle。 https://jsfiddle.net/k9oo7wLz/1/
答案 1 :(得分:2)
使用m
标志在多线模式下搜索
var regex = /Customer:\s*(\w+)\s*(\w*)/gmi;
var result = regex.exec(inputStr);
var firstName = "";
var lastName = "";
if (result) {
firstName = result[1];
if (result.length === 3)
lastName = result[2];
}
答案 2 :(得分:2)
以上是Dummy答案的改进版本:
var text = yourInputText;
var regex = /Customer:\s*(\w+)\s(\w*)/gm;
var result = regex.exec(text);
var theValue;
if (result) {
theValue = "First Name: " + result[1];
if ( result[2] != "" ) {
theValue += "<br/>Last Name: " + result[2];
}
}
您必须测试result[2]
的值,而不仅仅是测试结果数组的长度。这是因为正则表达式中有两个捕获组。在这种情况下,长度总是3,但第三个元素将为空。
我想不出一个不需要你做一些捕获后逻辑的正则表达式。您要么必须有一个大型捕获组,它将获得两种类型的字符串或两个捕获组。您只需要决定哪种逻辑最适合您
我已经在jsfiddle中将其设置为将此逻辑绑定到一个函数中,并将其附加到包含示例字符串的两个div的单击,然后尝试一下。我在小提琴中使用的$函数只是来自MooTools,以便我访问DOM,不要被它们分心。如果你试图复制这个小提琴,你必须确保导入MooTools以使它在你自己的小提琴中工作。
答案 3 :(得分:1)