Javascript正则表达式:获取特定行和字符的文本#

时间:2014-07-12 00:01:39

标签: javascript regex

鉴于一大块文字(想象一本书中的一页),我怎样才能在特定的一行和一个字符上得到这个词?

在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/

4 个答案:

答案 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);

http://jsfiddle.net/2DFhM/1/

答案 2 :(得分:2)

使用此正则表达式:

^(?:.*(?:\r?\n)*){2}.{6}\W+(\w+)

<强>解释

  • ^锚点断言我们位于字符串的开头
  • 要进入第3行,我们需要跳过两行
  • 我们的队长是(?:.*(?:\r?\n)*){2},匹配任何不是换行符的字符,然后是换行符
  • .{6}吃掉前六个字符
  • 从字符7开始没有单词,所以我们将匹配下一个单词:
  • \W+匹配任何非单词字符
  • (\w+)将字组字符捕获到第1组
  • 我们从第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