返回具有匹配单词的行及其后一行,并按降序排列

时间:2018-10-24 19:43:36

标签: javascript regex

请明确说明,我需要JavaScript而不是Powershell的帮助。下面在Powershell中的示例仅用于演示。

我想在Javascript中实现的工作是返回包含匹配单词 banana 的行及其后一行,最后按降序列出。

输入数据示例:

  

2018-01-01产品:苹果一些文字

     

2018-01-01价格:1欧元,一些文字

     

2018-01-02产品:香蕉一些文字

     

2018-01-02价格:3欧元一些文字

     

2018-01-03产品:橙色一些文本

     

2018-01-03价格:4欧元欧元一些文字

     

2018-01-04产品:香蕉一些文字

     

2018-01-04价格:1欧元欧元一些文字

这在Powershell中对我有效:

$input = Get-Content -Path $inputRaw | Select-String -Pattern "banana (.*)" -Context 0,1
$input | Group-Object -Property Name | Sort-Object -Property Name | ForEach-Object {$_.Group | Sort-Object} > $output

变量输出的结果应为:

  

2018-01-02产品:香蕉一些文字

     

2018-01-02价格:3欧元一些文字

     

2018-01-04产品:香蕉一些文字

     

2018-01-04价格:1欧元欧元一些文字

2 个答案:

答案 0 :(得分:2)

您可以使用reduce创建一个新的项目数组,方法是找到带有Bananas的行和其后的行,并将它们推到新的数组上。

const input = `2018-01-01 Product: Apple Some text
2018-01-01 Price: Euro 1 Some text
2018-01-02 Product: Banana Some text
2018-01-02 Price: Euro 3 Some text
2018-01-03 Product: Orange Some text
2018-01-03 Price: Euro 4 Some text
2018-01-04 Product: Banana Some text
2018-01-04 Price: Euro 1 Some text
2018-01-04 Product: Apple Some text
2018-01-04 Price: Euro 1 Some text
2018-01-04 Product: Pear Some text
2018-01-04 Price: Euro 1 Some text`;

function find(text, ...words) {
  return text.split(/\r\n|\n/).reduce((arr, val, idx, orig) => {
    return words.some(w => val.includes(w)) ? arr.concat(orig[idx], orig[idx + 1]) : arr
  }, [])
}

document.querySelector('textarea').value = find(input, 'Banana', 'Orange').join('\n')
console.log(find(input, 'Pear'))
<textarea rows="6" cols="50"></textarea>

编辑

您可以将单词数组传递给函数(如果需要,我使用了spread syntax方法,对IE的支持不多),然后在这些单词上使用some来检查是否至少有一个单词这些项目与字符串匹配。

答案 1 :(得分:1)

您可以使用此正则表达式创建纯正则表达式解决方案:

'1'

它将使第一句话与“香蕉”相匹配,并与其余行匹配,然后添加下一行。

如果需要,可以在索引'2''text'处抓取每一行。

以这种方式使用它(假设您的字符串称为var match = text.match(/(^.*?Banana.*\n)(.*?$)/gm); var firstPart = match[1]; var secondPart = match[2];

'fruit'

修改

要使用变量而不是对“香蕉”进行硬编码,可以将字符串构造函数用于正则表达式(假设您的var称为var regex =new RegExp('(^.*?' + fruit + '.*\\n)(.*?$)','gm');

if (process.server) {
  const { default: axios } = await import('axios');
  // axios stuff
}