【问题标题】:How to split "sTest_Val_1 < 50" string to "sTest_Val_1", "<", "50"如何将“sTest_Val_1 < 50”字符串拆分为“sTest_Val_1”、“<”、“50”
【发布时间】:2017-06-20 18:36:56
【问题描述】:

我想通过在 sTest_Val_1 ("30") 变量中输入一个值来获得 True 或 False 值。

所以我们尝试拆分和分离变量和运算符。

一开始我使用了以下源码。

但是,这个源代码导致了问题,因为它也是从 sTest_Val_1 中拆分“_”。

由于变量中的特殊字符,我无法正确拆分。所以我不能将“30”的值放入变量中。

 var expression = "sTest_Val_1 < 50";  //or "sTest_Val_1<50"
 var copy = expression; //"sTest_Val_1 < 50"

 expression = expression.replace(/[0-9a-zA-Z]+/g, "#");  //"#_#_# < #"
 var numbers = copy.split(/[^0-9a-zA-Z\.]+/); //[sTest,Val,1,50]
 var operators = expression.split("#").filter(function (n) { return n }); //[_,_, < ]
 var result = [];
 var sRst = "";

 result.push(numbers[i]);
 sRst += numbers[i];
 if (i < operators.length) {
    result.push(operators[i]);
    sRst += operators[i];

 console.log(sRst);  
 return eval(sRst);  // I want True, False

sTest_Val_1 的值在另一个页面中定义。 (我在加载第一页时将此值传递给 javascript 对象。)

string sTest_Val_1 = "30";
string sTest_Val_2 = "30";
string sTimeVal_1 = "65380";
// ....

"sTest_Val_1" 该值的第一个字符只能包含字母字符。

但是字符的长度是随机的,字符中的特殊字符也是随机的。 (、+、- 和 = 不包括在内。)

我的英语不够好。请理解。

【问题讨论】:

  • 按空格分割?
  • 但我不能确定是否会输入空格。
  • 就不能按运营商拆分吗?
  • 按算子拆分,那么如何得到算子?
  • 在拆分之前,您正则表达式以捕获运算符。

标签: javascript regex


【解决方案1】:

您可以使用 RegEx 来查找运算符的位置,而无需知道确切的运算符。 /&lt;|&gt;|\+|\-|=|&amp;&amp;/ 将匹配 、+、= 或 &&

var expression = "sTest_Val_1 < 50";  //or "sTest_Val_1<50"
var regResult = /<|>|\+|\-|=|&&/.exec(expression); //match <, >, +, = or &&
if(!regResult.length){ //regResult is an array containing the operators found
   // handle no operator found
}
var opIdx = regResult.index; //the index of the first found operator
var op = regResult[0];
var variable = expression.substring(0, opIdx).trim(); //split until operator and trim whitespaces
var value = expression.substring(opIdx + op.length, expression.length).trim(); //split after operator and trim whitespaces

注意:如果您希望表达式中有多个运算符,您可能应该遍历 regResult 并对子字符串参数进行一些修改。

另外,使用evalis a bad ideea,我建议你在操作符上做一个开关,并正确检查条件以返回操作结果。

【讨论】:

  • 谢谢!另外,感谢您让我知道 eval 是一个坏主意。你的意思是使用 switch ?
  • @cherryJang 我不确定您要评估什么,但如果您可以使用 switch 和/或 ifs,您应该这样做。
  • 哦!还有“sTest_Val_1
  • 当然,只需将所有运算符添加到正则表达式中,并在它们之间添加|/&lt;|&gt;|\+|\-|=|&amp;&amp;/)。但是在执行子字符串时,您必须考虑运算符的长度(更新答案)
【解决方案2】:

您可以使用捕获组按运算符(保留运算符)进行拆分。

expression = "sTest_Val_1 < 50"
expression.split(/(<|>|\+|\-|=|&&)/)

将导致["sTest_Val_1 ", "&lt;", " 50"]

【讨论】:

  • 哦,谢谢您的回答!这也很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多