JavaScript中的查找/替换任务

时间:2019-06-27 09:42:27

标签: javascript node.js

给出一个输入字符串,我需要找到并替换它:

funccall(x, y, z, w)

与此:

call(x, y, 0, z, w)

逗号之间以及逗号和方括号之间的所有内容都是未知的(即,每个输入可能不同)。其中包括x,y,z和w的值,以及它们之间的间距。

但是funccall部分是常量(即,这是我应该寻找的实际子字符串),并且我需要在第二个逗号后插入0,的事实也是常量。 / p>

这是我的方法:

function fix(str) {
    const index0 = str.indexOf('funccall');
    if (index0 >= 0) {
        const index1 = str.indexOf(',', str.indexOf(',', index0) + 1);
        const part0 = str.substring(0, index0);
        const part1 = str.substring(index0 + 'func'.length, index1) + ', 0';
        const part2 = str.substring(index1);
        return part0 + part1 + part2;
    }
    return str;
}

我真的希望有一种单线解决方案(或者至少是一种接近单线的解决方案)。

有人对此有任何好的改进建议吗?

非常感谢您!

2 个答案:

答案 0 :(得分:2)

如果您可以依靠参数分隔符之外不包含逗号的输入字符串,则可以改用正则表达式-匹配x, y,部分和{{1} }部分,并将z, w放在中间:

0,

模式由2组组成:

  • const fix = str => str.replace( /(funccall\((?:[^,]+,){2})([^,]+,[^,]+\))/g, (_, g1, g2) => `${g1} 0,${g2}` ); console.log(fix('funccall(x, y, z, w)'));
    • (funccall\((?:[^,]+,){2})-匹配funccall\(后跟funccall
    • (-匹配两次(除了逗号,然后是逗号)
  • (?:[^,]+,){2})
    • ([^,]+,[^,]+\))-匹配除逗号之外的任何内容,后跟逗号
    • ([^,]+,-后面跟逗号以外的其他任何字符(最终参数没有尾随 逗号)
    • [^,]+-后跟\)

答案 1 :(得分:1)

  

逗号之间以及逗号和方括号之间的所有内容都是未知的(即,每个输入可能不同)。

  

我真的希望有一种单线解决方案(或者至少是一种接近单线的解决方案)。

没有一个,JavaScript(我假设输入字符串是JavaScript)太复杂了。您将获得正则表达式“单线”答案。他们会错的。您需要平衡括号,大括号,方括号,单引号,双引号和反引号(至少);并且您需要处理评论(包括多行评论);等等,等等。

您需要一个JavaScript解析器。 Node.js可以使用几种可用的选项,例如@babel/parserBabel使用的解析器)和Esprima

在解析器提供的树中,您将查找名称为<?php require "fpdf/fpdf.php"; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'C:\PHPMailer\PHPMailer-master\src\Exception.php'; require 'C:\PHPMailer\PHPMailer-master\src\PHPMailer.php'; require 'C:\PHPMailer\PHPMailer-master\src\SMTP.php'; $name = $_POST['name']; $email = $_POST['email']; $message = $_POST['message']; $mail = new PHPMailer(TRUE); try { $mail->isHTML(true); $mail->setFrom('example@hotmail.co.uk', 'Contact Form'); $mail->addAddress('example@hotmail.co.uk', 'eg'); $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = TRUE; $mail->SMTPSecure = 'tls'; $mail->Username = '********'; $mail->Password = '********'; $mail->Port = 587; $pdf = new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','B',16); $pdf->Cell(40,10, 'Name:'); $pdf->Ln(); $pdf->Cell(40,10, $name); $pdf->Ln(); $pdf->Cell(40,10, 'Email:'); $pdf->Ln(); $pdf->Cell(40,10, $email); $pdf->Ln(); $pdf->Cell(40,10, 'Their message:'); $pdf->Ln(); $pdf->Cell(40,10, $message); $pdfdoc = $pdf->Output('', 'S'); $pdf->Ln(); if ($mail->addReplyTo($_POST['email'], $_POST['name'])) { $mail->Subject = 'contact form'; $mail->isHTML(true); $mail->Body = "There has been a message sent from our contact form <br>Details can be found in the attached pdf"; $mail->addStringAttachment($pdfdoc, 'contact.pdf'); //Send the message, check for errors if (!$mail->send()) { //The reason for failing to send will be in $mail->ErrorInfo $msg = 'Sorry, something went wrong. Please try again later.'; } else { $msg = 'Message sent! Thanks for contacting us.'; header("Refresh:3; url=index.php#contact"); echo "Message sent! Thanks for contacting us. We aim to respond within 1 working day"; } } else { $msg = 'Invalid email address, message ignored.'; } /* Enable SMTP debug output. */ $mail->SMTPDebug = 4; // $mail->send(); } catch (Exception $e) { echo $e->errorMessage(); } catch (\Exception $e) { echo $e->getMessage(); } ?> 的函数调用。树中的节点(在一个良好的解析器中)将告诉您该调用的源文本字符串中的开始和结束位置,当然,该节点的所有各个部分都有嵌套节点。

它不会像您想象的那么复杂。