正则表达式匹配由一个或多个字母或数字包围的所有单个下划线

时间:2016-01-12 00:34:20

标签: javascript regex

我正在尝试找到所有单个下划线,它们被字符串中的一个或多个字母或数字包围。 E.g:

ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8

*注意:字符串的长度和下划线的数量是未知的。该字符串还可以包含多个下划线。 *

我确信这很容易,但我对正则表达式并不陌生。这是我到目前为止所做的,但它只匹配第一次出现。

[a-zA-Z0-9]+(_)+[a-zA-Z0-9]

最终目标是用另一个角色替换下划线。

3 个答案:

答案 0 :(得分:2)

a_b_c之类的情况下,为避免匹配消耗b,包括第一个下划线(这会阻止匹配第二个下划线),您可以使用前瞻,检查匹配当前位置但不消耗任何输入。 (更简单的是前瞻和后视,但JavaScript不支持lookbehinds。)

/[a-zA-Z0-9]_(?=[a-zA-Z0-9])/g

除此之外,您只获得一场比赛的唯一原因是您没有包含/g(全局)标志。 /g会导致String#match返回所有匹配而不是第一次匹配的所有捕获String#replace,导致它替换所有实例而不仅仅是第一个匹配,RegExp#exec ** s.replace(/([a-zA-Z0-9])_(?=[a-zA-Z0-9])/g, '$1**'); +通过使它继续匹配上一个匹配,所以你可以在循环中使用它。

以下是使用固定字符串150_297_832替换所有此类下划线:

var s = '150_297_832';
var result = s.replace(/(\d+)_(?=(\d+))/g, function (match, left, right) {
    var sum = parseInt(left, 10) + parseInt(right, 10);
    return ' (' + sum + ') ';
});

// result = ' (447)  (1129) 832';
// 447 is 150 + 297, 1129 is 297 + 832, 832 was not replaced

如果您确实需要完整的环境来进行替换,您可以将 DateTime d1 = new DateTime(2015, 05, 15).ToUniversalTime(); DateTime d2 = new DateTime(2015, 02, 02).ToUniversalTime(); Console.WriteLine(d1.ToString()); //OUTPUTS - 1/05/2015 12:00:00 p.m. Console.WriteLine(d2.ToString()); //OUTPUTS - 1/02/2015 11:00:00 a.m. 量词保留在第一组中,并将捕获组放在前瞻中。 (那仍然有效!)

一个例子可能会更清楚 - 这是一个将在Dim queryEthnicities = From aParentEthnicity In edata.Ethnicity _ Group Join aChildEthnicity In edata.Ethnicity On aChildEthnicity.ParentID Equals aParentEthnicity.EthnicityID Into EthnicityList = Group _ Where aParentEthnicity.RoundID.Equals(aRoundID) Order By aParentEthnicity.Sort 之类的字符串中添加每对数字的那个:

{{1}}

答案 1 :(得分:1)

试试这个正则表达式:

([a-zA-Z0-9])_([a-zA-Z0-9])

您可以像这样用它来代替' - '

str.replace(/([a-zA-Z0-9])_([a-zA-Z0-9])/g, "$1-$2")

您可以添加任何其他字符或字符串来代替' - '

此正则表达式匹配(A-Z或a-z或0-9),下划线和(A-Z或a-z或0-9)

<强>解释

[a-zA-Z0-9]匹配小字母或大写字母和数字。

():制作一个匹配组,([a-zA-Z1-9])组成一组,以便稍后在解决方案中使用它。

_显然匹配下划线。

替换字符串中的

$1$2是指正则表达式中的第一个和第二个匹配组。

答案 2 :(得分:0)

你几乎就在那里,考虑你的正则表达式:

[a-zA-Z0-9]+ // a-z, A-Z and 0-9, matched one or more times (greedy) 
(_)+         // _ in capture group, matched one or more times (greedy)
[a-zA-Z0-9]  // a-z, A-Z and 0-9, matched exactly one time

您不需要匹配下划线前面的多个字符,也不需要匹配多个下划线:

/[a-zA-Z0-9]_[a-zA-Z0-9]/g
//                       ^ Note the global flag

您还可以使用等于\w的{​​{1}},但请注意它也与下划线匹配:

[A-Za-z0-9_]

将所有内容与匹配组和/[\w]_[\w]/g

联系起来
.replace(search, replacement)