请明确说明,我需要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欧元欧元一些文字
答案 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
}