我正在使用match()
和regex
来接收所有出现的“名称”数组。名称可以是任何字符串,并且仅是此示例中的占位符。
正如您在前两次迭代中看到的那样,我收到了预期的输出。但是,第三次迭代会忽略第一个\n
并输出前一行。
为什么会发生这种情况?
$("#shortDescTextarea").on('keyup', function() {
var currentVal = $(this).val();
var allItemNames = currentVal.match(/\n[^:]+:/g);
console.log(allItemNames);
});
textarea{height:250px;width:500px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="shortDescTextarea" class="form-control">|H|Header|/H|
Name: Value
Name: Value
|H|Header|/H|
Name:
</textarea>
答案 0 :(得分:2)
您不应该在\n
上进行匹配,因为不能保证它在那里(例如,Name:...
恰好是文本的第一行)。而是使用m
(多行)标志,其中^
与行的开头相匹配,但是确实如此。同样,您可以使用?
“ non-greedy”修饰符来确保您不跨越冒号,这使得使用.
(与换行符不匹配)变得容易,从而避免了明确防范他们。最终结果:
/^.*?:/gm
要捕获前冒号和后冒号值:
let str = `
Name: Foo
Name: Bar
Header stuff I don't understand
Name: Quux
`;
let re = /^(.*?):\s*(.*)$/gm
results = [];
while (m = re.exec(str)) {
results.push([m[1], m[2]]);
}
console.log(results);
答案 1 :(得分:1)
解决此问题的一种方法是在括号内添加\n
,如下所示:
currentVal.match(/ \ n [^:\ n] +:/ g);
请注意,此/\n[^:]+:/g
将捕获\n
和:
之间不包含:
字符的所有字符,因此此模式\n|H|Header|/H|\nName:
将是捕获。
示例:
$("#shortDescTextarea").on('keyup', function()
{
var currentVal = $(this).val();
var allItemNames = currentVal.match(/\n[^:\n]+:/g);
console.log(allItemNames);
});
textarea{height:250px;width:500px;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="shortDescTextarea" class="form-control">|H|Header|/H|
Name: Value
Name: Value
|H|Header|/H|
Name:
</textarea>