我正在尝试找到所有单个下划线,它们被字符串中的一个或多个字母或数字包围。 E.g:
ChIJww8705e81qjAgU_IJww8705ZZkW_e81qjAg_ChIJww8
*注意:字符串的长度和下划线的数量是未知的。该字符串还可以包含多个下划线。 *
我确信这很容易,但我对正则表达式并不陌生。这是我到目前为止所做的,但它只匹配第一次出现。
[a-zA-Z0-9]+(_)+[a-zA-Z0-9]
最终目标是用另一个角色替换下划线。
答案 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)