Javascript获取字符串之间的所有文本

时间:2018-02-08 08:41:37

标签: javascript regex

我有通过TCP传递给我的字符串内容。此信息仅相关,因为这意味着我不会一直检索相同的字符串。我有一个<start><stop>分隔符,以确保每次通过TCP获取数据时,我都会输出完整的内容。

我的传入内容如下:

<start>Apple Bandana Cadillac<stop>

我希望在<start><stop>之间获取所有内容。所以只需Apple Bandana Cadillac

我这样做的脚本如下:

servercsv.on("connection", function(socket){
    let d_basic = "";
    socket.on('data', function(data){
        d_basic += data.toString();
        let d_csvindex = d_basic.indexOf('<stop>');
            while (d_csvindex > -1){
                try {
                    let strang = d_basic.substring(0, d_csvindex);
                    let dyson = strang.replace(/<start>/g, '');
                    let dson = papaparse.parse(dyson);
                    myfunction(dson);
                }
                catch(e){ console.log(e); }
                d_basic = d_basic.substring(d_csvindex+1);
                d_csvindex = d_basic.indexOf('<stop>');
            }
    });
});

这意味着我在<stop>字符串之前获取所有内容并输出它。我还添加了一行let dyson = strang.replace(/<start>/g, '');,因为我想删除<start>文字。

但是,因为这是TCP,我无法保证获得此字符串的所有部分。因此,我经常收回stop>Apple Bandana Cadillac<stop>或其中的一些变体(例如start>Apple Bandana Cadillac<stop>。这不够完整,我只能做strang.replace("start>", "")

理想情况下,我希望我的分隔符选择介于<start><stop>之间的内容。不只是<stop>。但是,我不确定该怎么做。

或者,我也可以选择在我的while循环中检索<start><stop>个字符串的所有组合的正则表达式,然后删除它们。因此,请单独检查<, s, t, a, r, t,依此类推。但不确定如何实现正则表达式来删除整个字符串的部分。

2 个答案:

答案 0 :(得分:5)

假设您得到完整回复:

var test = "<start>Apple Bandana Cadillac<stop>";
var testRE = test.match("<start>(.*)<stop>"); 
testRE[1] //"Apple Bandana Cadillac"

如果<start><stop>之间有新行

var test = "<start>Apple Bandana Cadillac<stop>";
var testRE = test.match("<start>([\\S\\s]*)<stop>"); 
testRE[1] //"Apple Bandana Cadillac"

在此处使用正则表达式捕获组。

答案 1 :(得分:3)

使用replace()方法尝试此正则表达式:

/<st.*?>(.*?)(?!<st)/g

<强>字面........................................... ......: <st

任何字符数为零{或}次{... 3}}: .*?

<强>字面........................................... .......: >

开始lazily ..........................: (

任何字符数为零{或}次{... 3}}: .*?

结束capture group .............................: {{1} }

开始lazily .................: )

<强>字面........................................... ........: (?!

结束capture group ....................: <st

在下面的演示中,请注意测试示例包含多行,以及)<start>(基本上为<stop>)的差异。

<小时/>

演示1

<st

更新

  

“说我有var rgx = /<st.*?>(.*?)(?!<st)/g; var str = `<start>Apple Bandana Cadillac<stop> <stop>Grapes Trampoline Ham<stop> <start>Kebab Matador Pencil<start>`; var res = str.replace(rgx, `$1`); console.log(res); Grapes Trampoline Ham op> ...仍在尝试删除字符串的所有部分<stop>

<stop>

一个简单的解释必须要做,因为演示1等一步一步会花费太多时间。

  • 此RegEx是多行的。 /^(.*?>)(.*?)(<.*?)$/gm;
  • /m ..........开始行。
  • ^ ..懒洋洋地捕捉所有内容直到文字(.*?>) ........ [以[{1}}返回]
  • > ...然后懒洋洋地抓住所有东西,直到................ [以[{1}}返回]
  • $1 ..文字(.*?)并且懒洋洋地抓住所有内容直到... [以[{1}}返回]
  • $2 ...........结束行。

诀窍是替换第二次捕获(<.*?)并单独留下<$3

演示2

$