Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript正则表达式如何动态提取子字符串_Javascript_Regex - Fatal编程技术网

JavaScript正则表达式如何动态提取子字符串

JavaScript正则表达式如何动态提取子字符串,javascript,regex,Javascript,Regex,我需要在动态输入中提取一个子字符串,我已经实现了我需要的输出,但它只是纯硬代码,所以它没有那么动态和可靠。是否有其他方法提取零件“B1003=工程名片”(项目说明)和“2”(数量),这两个都是动态的,可以输入完全不同的项目,例如;“O1003=铅笔”,“O1004=便签”。有没有一种方法可以在正则表达式中对其进行编码,从而实现更可靠的代码 这里读取的输入来自使用Tesseract OCR提取的文本,我需要提取所需的信息并将其传递给另一个服务 var requision=`行 行项目说明类别名称

我需要在动态输入中提取一个子字符串,我已经实现了我需要的输出,但它只是纯硬代码,所以它没有那么动态和可靠。是否有其他方法提取零件“B1003=工程名片”(项目说明)和“2”(数量),这两个都是动态的,可以输入完全不同的项目,例如;“O1003=铅笔”,“O1004=便签”。有没有一种方法可以在正则表达式中对其进行编码,从而实现更可靠的代码

这里读取的输入来自使用Tesseract OCR提取的文本,我需要提取所需的信息并将其传递给另一个服务

var requision=`行
行项目说明类别名称数量计量单位价格金额(美元)状态资金状态//此行为静态
1 B1003=工程名片名片2 Ea 50.00USD 100待定审批未保留//此行是动态的
请求者Jay Doe供应商ABC公司//此行是静态的
线
行项目说明类别名称数量计量单位价格金额(美元)状态资金状态//此行为静态
1 O1003=铅笔办公用品5个50.00美元100待批未保留//此行是动态的
请求者Jay Doe供应商ABC公司//此行是静态的
`;
//规则1-获取所有项目+数量
//规则2-获取所有项目
//规则3-获取所有数量
//resultArray-包含数量+项目,例如2张B1003工程名片
var rule1=/(B1002=会计名片| B1003=工程名片| B1001=销售和营销名片| O1001=带橡皮擦的黑色圆珠笔牌熊猫牌普通款| O1002=笔记本| O1003=铅笔| O1004=便签)(.*)([0-9]|[0-9][0-9]|[0-9][0-9])/
var规则2=/(B1002=会计名片| B1003=工程名片| B1001=销售和营销名片| O1001=带橡皮擦的黑色圆珠笔牌熊猫牌普通款| O1002=笔记本| O1003=铅笔| O1004=贴纸)/
变量规则3=/([0-9]|[0-9][0-9]|[0-9][0-9][0-9])/
var resultarray=[]
var stringarray=requisition.split(“\n”)
stringarray.forEach(元素=>{
var result=element.match(规则1)
如果(结果!=null){
var itemName=result[0]。匹配(规则2)
变量数量=结果[0]。匹配(规则3)
resultarray.push(数量[0]+“”+itemName[0])
}
});

console.log(resultaray.join(“,”)
您可以将其全部放入一个正则表达式中,并在一个组中捕获
数量
,在另一个组中捕获
项目名称
。然后从匹配中提取这些组(如果存在匹配):

var requision=`行
行项目说明类别名称数量计量单位价格金额(美元)状态资金状态//此行为静态
1 B1003=工程名片名片2 Ea 50.00USD 100待定审批未保留//此行是动态的
请求者Jay Doe供应商ABC公司//此行是静态的
线
行项目说明类别名称数量计量单位价格金额(美元)状态资金状态//此行为静态
1 O1003=铅笔办公用品5个50.00美元100待批未保留//此行是动态的
请求者Jay Doe供应商ABC公司//此行是静态的
`;
var规则=/(B1002=会计名片| B1003=工程名片| B1001=销售和营销名片| O1001=带橡皮擦的黑色圆珠笔牌熊猫牌普通款| O1002=笔记本| O1003=铅笔| O1004=贴纸)。*(\d{1,3})/
var resultarray=[]
var stringarray=requisition.split(“\n”)
stringarray.forEach(元素=>{
常量匹配=元素匹配(规则);
如果(匹配){
常量[,项目名称,数量]=匹配;
结果数组推送(数量+“”+项目名称);
}
});
console.log(resultarray)
简短回答:

var requisition = `Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 B1003 = Engineering Business Card 2 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
Lines
Line Item Description Category Name Quantity UOM Price Amount (USD) Status Funds Status //this line is static
1 O1003 = Pencil Office Supplies 5 Ea 50.00USD 100 Pending Approval Not Reserved //this line is dynamic
Requester Jay Doe Supplier ABC Corp //this line is static
`;

//rule 1 - Gets all Items + Quantity
//rule 2 - Gets all Items
//rule 3 - Gets all Quantity
//resultArray - Contains Quantity + Item e.g. 2 B1003 Engineering Business Cards

var rule1 = /(B1002 = Accountant Business Card|B1003 = Engineering Business Card|B1001 = Sales and Marketing Business Card|O1001 = Black Ballpen Branded Panda Regular with Eraser|O1002 = Notebook|O1003 = Pencil|O1004 = Stick Notes)[^\d]+(\d+) .*/

var resultarray = []

var stringarray = requisition.split("\n")
stringarray.forEach(element => {
    var result = element.match(rule1)
    if (result!=null){
        var itemName = result[1]
        var quantity = result[2]
        resultarray.push (quantity + " " + itemName)
    }
});

console.log (resultarray.join(", "))
输出:

2 B1003 = Engineering Business Card, 5 O1003 = Pencil
长答覆:

有很多事情需要解决:

  • 使用(\d+)仅使用规则1(经过一些修改)匹配所有内容(项目名称和数量)
  • 摆脱规则2和3
  • 使用结果[1]作为项目名称,使用结果[2]作为数量

  • 请注意,您的所有字段都是空格分隔的,并且字段可以包含空格,因此您的数据不是结构化的。例如,如果您有一个以制表符分隔的文件,它将更加可靠。因此,我用来查找数量的规则是“忽略产品名称后面的所有内容,直到有一个数字为止”。但是,如果有一天你的类别包含一个数字,你将被卡住,如果没有结构化文件,
    ([0-9]|[0-9][0-9]|[0-9][0-9][0-9])
    可能应该写成
    (\d{1,3}
    (\d+)
    。其余内容太模糊。请提供您需要匹配的模式的确切要求。使用
    新的RegExp(variable)
    。您好。感谢您花时间分析我的代码,但我很困惑,运行您的代码片段时的输出是:[“0 B1003=工程名片”]当取数量时,即“2”,取“Ea”前的数字在我发布答案后,您编辑了您的问题,因此我的答案片段中没有包含您编辑的输入。在输入新输入后,它看起来像desiredI一样运行。我有一个问题要澄清,是否可以在不使用特定词语的情况下获得所需的输出?例如,工程名片等。是否可以使用纯正则表达式识别?或者这是唯一的方法吗?除非你能识别出一种模式。例如从
    工程名片
    。你如何确定你想要
    工程名片
    ,而不是
    工程名片
    工程名片
    ?是的,我在ce,你能再检查一次图像吗?这是我唯一的模式,第一行是静态的,还有单词“Ea”,其余是动态的。工程名片后的“名片”是它的类别,请检查所附的图像,我编辑了它。好的,得到了,我修改了我的答案,现在它与2项匹配:th