13

我有一个看起来像这样的字符串:“Doe, John, A”(姓氏、名字、中间名首字母)。

我正在尝试编写一个将字符串转换为“Doe*John*A”的正则表达式。

但是,我必须考虑此字符串的所有空格,因此“Doe , John , A”仍会转换为“Doe*John*A”。

此外,字符串“Doe John A”应转换为“Doe*John*A”。

我开始写这篇文章,但我认为我被困在空格和用户不提供逗号的可能性上。

这是我所拥有的:

var myString = "John, Doe, A";
var myOtherString = "John  Doe   A";


var myFunction = function (aString) {
        aString = aString.replace(", ", "*");
        aString = aString.replace(", ", "*");

return aString;

};

这些都应该返回"Doe*John*A"

我想我在这个功能中重复自己太多了。我也没有考虑到不提供逗号的可能性。

有一个更好的方法吗?

4

4 回答 4

16

就在这里。改为使用replace带有正则表达式的函数。这有几个优点。首先,您不必再调用它两次。其次,很容易解释任意数量的空格和可选的逗号:

aString = aString.replace(/[ ]*,[ ]*|[ ]+/g, '*');

请注意,空格周围的方括号是可选的,但我发现它们使空格字符更易于阅读。如果您想允许/删除那里的任何类型的空格(制表符和换行符),请\s改用:

aString = aString.replace(/\s*,\s*|\s+,/g, '*');

请注意,在这两种情况下,我们都不能简单地将逗号设为可选,因为这将允许零宽度匹配,这将*在字符串中的每个位置引入 a。(感谢 CruorVult 指出这一点)

于 2012-12-19T15:43:46.990 回答
7

如果要替换所有非单词字符,请尝试以下操作:

str.replace(/\W+/g, '*');
于 2012-12-19T15:54:44.240 回答
3

String.replace 仅替换第一次出现。要全部替换它们,请为“global”添加“g”标志。您还可以使用字符组和 + 运算符(一个或多个)来匹配字符链:

aString.replace("[,\s]+", "*", "g");

这将用 . 替换所有逗号和空格链*

于 2012-12-19T15:43:58.870 回答
1

试试这个删除所有空格和逗号,然后用 * 替换。

Myname= myname.replace(/[,\s]/,"*")

编辑为从模式中删除“至少两个项目”。但至少要有一个项目。

Myname= myname.replace(/([,\s]{1,})/,"*")

参考:在 Rublar 上。但是,根据 m.buettner,您最好使用正则表达式 :)

于 2012-12-19T15:49:10.653 回答