鉴于一大块文字(想象一本书中的一页),我怎样才能在特定的一行和一个字符上得到这个词?
在Ln#3,Ch#7“只是”找到并返回单词。
var text = "Lorem ispum dolar\n
Si emit I dont know latin\n
Really just making this up as I go\n
Ok this should be enough for us to work on.\n
JSFiddle尝试代码:http://jsfiddle.net/xa9xS/709/
答案 0 :(得分:4)
您可以使用类似(?:.*\n){2}.{6}\s+(\w+)
之类的内容,这将从字符6 + 1开始获得第2 + 1行的字。
编辑:想象我稍微强调它。如果在单词的中间提供字符索引,则上述内容无法匹配。在开始捕获之前,以下内容将跳过一个单词的开头:(?:.*\n){2}.{6}.*?\b(\w+)\b
。
PS:javascript中的正则表达式并不支持正面的后观,所以跳回到单词的开头是相当棘手的。
Edit2:使string.replace工作需要我们捕获字符串的其他部分。这似乎可以解决问题:text.replace(/((?:.*\n){2}(?:.{6}.*?))\b(\w+)\b((?:.*\n?)*)/g, "$1[the-replacement]$3")
但它确实使问题复杂化。在这种情况下使用更直接的方法可能更好。朴素是王道!
答案 1 :(得分:3)
window.example_text = "Lorem ispum dolar\n\
Si emit I dont know latin\n\
Really just making this up as I go\n\
Ok this should be enough for us to work on.\n";
var lineNumber = 3;
var charNumber = 7;
var match = (example_text.split("\n")[lineNumber - 1]).substr(charNumber).split(/\s/)[0];
console.log(match);
答案 2 :(得分:2)
使用此正则表达式:
^(?:.*(?:\r?\n)*){2}.{6}\W+(\w+)
<强>解释强>
^
锚点断言我们位于字符串的开头(?:.*(?:\r?\n)*){2}
,匹配任何不是换行符的字符,然后是换行符.{6}
吃掉前六个字符\W+
匹配任何非单词字符(\w+)
将字组字符捕获到第1组在JS中:
var myregex = /^(?:.*[\r\n]*){2}.{6}\W+(\w+)/;
var matchArray = myregex.exec(yourString);
if (matchArray != null) {
thematch = matchArray[1];
} else {
thematch = "";
}
答案 3 :(得分:0)
可能太晚了,现在大声笑,很多好的答案,但这里是为了完整:
在此处制作此正则表达式:http://regex101.com/r/nF2vX8/1
(?:.*\n.*){2}^(?:.{7})(\w*\W)
这是javascript中的解决方案:
var index_left = 0, index_right = 0, stringy = "";
for (; line_number-- > 0;){
index_left = index_right;
index_right = example_text.indexOf("\n", index_right) + 1;
}
stringy = example_text.substring(index_left, index_right-1);
index_left = 0;
index_left = stringy.indexOf(" ", char_number+1);
stringy = stringy.substring(0, index_left);
index_left = stringy.lastIndexOf(" ", index_left);
stringy = stringy.substring(index_left+1);
console.log(stringy);
和js的小提琴:http://jsfiddle.net/xa9xS/714/
它破坏了line_number
,但通过复制价值很容易解决,我现在太无聊了:P