从多行文本中获取第一个修剪过的字符串

时间:2016-05-10 10:51:37

标签: javascript regex

我的多行输入string

123
 2345 a

ab_cd: xxxx
   123abc     456
:y

我希望得到的是模式[0-9a-z_]{1,100}适合的每一行的第一个匹配 - 忽略开头的空格和空行。

所以我的预期结果是:

123
2345
ab_cd
123abc

我的模式似乎不起作用:

$entries = string.match(/^(?:\s*)([a-z0-9_]{1,100})(?:.*)$/gm);    

非捕获组似乎被忽略了。我明白了:

[ "123", " 2345 a", " ab_cd: xxxx", "   123abc     456" ]

只有:y被正确忽略。我在这做错了什么?虽然我已经添加了这个标签,但我想这不是JS问题......

编辑:我很乐意用正则表达式模式解决问题,而不是JS意味着。

3 个答案:

答案 0 :(得分:1)

您可以使用

/^[ \t]*([0-9a-z_]{1,100})/gm

并获取第1组中的值。

如果您还需要匹配大写字母,请使用

/^[ \t]*(\w{1,100})/gm
         ^^

请参阅regex demo



var re = /^[ \t]*(\w{1,100})/gm; 
var str = '123\n 2345 a\n\nab_cd: xxxx\n   123abc     456\n:y';
var res = [];
while ((m = re.exec(str)) !== null) {
    res.push(m[1]);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";
&#13;
&#13;
&#13;

模式详细信息:它使用/gm标记 - 全局和多行修饰符来匹配模式可以找到的所有子字符串,并使^与行的开头匹配。

  • ^ - 开始行
  • [ \t]* - 0+空格或标签
  • ([0-9a-z_]{1,100}) - 第1组:1到100个字母,数字或_。如果还要匹配大写,请改用\w

答案 1 :(得分:0)

您可以使用 split-trim-join 公式

var output = string.split("\n").map( function(val){
  return val.trim()
}).join("\n");

更多跨平台方式(同时照顾\r

var output = string.replace(/\r\n/g,"\n").split("\n").map( function(val){
  return val.trim()
}).join("\n");

答案 2 :(得分:0)

你的正则表达式可能类似于:

/^[\s]*([\da-z_]{1,100})/gm

Regex101 Demo

正则表达式说明:

^ assert position at start of a line
[\s]* match a single character present in the list below
    Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
    \s match any white space character [\r\n\t\f ]
1st Capturing group ([0-9a-z_]{1,100})
    [0-9a-z_]{1,100} match a single character present in the list below
        Quantifier: {1,100} Between 1 and 100 times, as many times as possible, giving back as needed [greedy]
        0-9 a single character in the range between 0 and 9
        a-z a single character in the range between a and z (case sensitive)
        _ the literal character _
m modifier: multi-line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)
g modifier: global. All matches (don't return on first match)