我想在javascript中捕获文本。该字符串采用以下格式。
*** Aug 29 2010 3:32PM username: and more texts in here
我想从文本中捕获用户名。我怎么能用正则表达式做到这一点?我尝试了许多不同的东西,但没有一个产生我想要的东西。用户名可以包含数字但不包含符号,并且是一个单词。
答案 0 :(得分:1)
我假设小时总是以这种方式显示,最终的:
始终存在:
/\d:\d\d\S\S (.*?):/g
应该捕获用户名并将其正确存储在第一个捕获组中。
演示1: https://www.regex101.com/r/pR7eT5/1
演示2: https://www.debuggex.com/r/NSlFDyt9toMCu7nJ
答案 1 :(得分:1)
一个简单的正则表达式:
\w+(?::)
这是冒号前的用户名。
如果你想要一个必须在时间和冒号之间的更具体的那个,那么使用:
(?:AM|PM)(?: )\w+(?::)
欢迎您在此处使用您的数据对其进行测试:RegexPal
只需将Regex粘贴到第一个框中,然后将数据粘贴到第二个框中。
修改强> 由于某些原因,非捕获组对JS替换无关紧要,因此我们可以使用捕获组将信息分成几部分:
var info = document.getElementById('info');
var newStr = info.innerHTML;
newStr = newStr.replace(/(AM|PM) (\w+):/g, '$1 <span class="label label-success">$2</span>:');
info.innerHTML = newStr;
*假设id="info"
元素具有数据
答案 2 :(得分:0)
一个简单的就是
str.replace(/.* (.*):/, "$1");
接受你的字符串并在$ 1中捕获最后一个空格和冒号之间的文本,然后用它替换字符串。
答案 3 :(得分:0)
如果您确定用户名是一个世界并且它在日期之后,那么您可以在用空格分割字符串后使用该位置
var line = "*** Aug 29 2010 3:32PM username: and more texts in here";
var user = line.split(' ', 6)[5].replace('\:', '');
alert(user)
或仅使用正则表达式匹配字符串:3:32PM username:
var line = "*** Aug 29 2010 3:32PM username: and more texts in here";
var regex = /(\d:\d\d(?:AM|PM) )(.*?):/
alert(regex.exec(line)[2]);
答案 4 :(得分:0)
请参阅非捕获组AM
内的PM
或(?:)
,后跟空格\s
然后捕获()
任何单词字符w+
(+
用于多个)
在上一个集合和文字符号:
(?:AM|PM)\s(\w+):
<强> Live example 强>
因此,如果您想要一个函数来简化用户名的检索,您可以这样做:
function getUsername( str ) {
return (/(?:AM|PM)\s(\w+):/.exec(str)||'')[1];
}
var userName = getUsername("*** Aug 29 2010 3:32PM username: and more texts in here");
如果找不到匹配项,上述内容将成功返回所需的用户名或undefined
。
答案 5 :(得分:-1)
你可以使用这种模式
:\S+\s([^:]+)
: # ":"
\S # <not a whitespace character>
+ # (one or more)(greedy)
\s # <whitespace character>
( # Capturing Group (1)
[^:] # Character not in [^:]
+ # (one or more)(greedy)
) # End of Capturing Group (1)
答案 6 :(得分:-1)
如果没有正则表达式,您可以更快地完成此操作:
str.split(' ').slice(5).join(' ').slice(0, -1);