node.js - 【javascript】怎么判断一段字符片段,是否一段纯粹的合法的javascript字符串格式?
天蓬老师
天蓬老师 2017-04-10 16:59:47
[JavaScript讨论组]

"abc" 合法字符串true

'abc' 合法字符串true

a+"abc" 变量加字符串false

"a"+b+'c' 变量加字符串false

""abc"" 非法格式false

'"abc"" 非法格式false

'"abc"' 合法字符串true

"'abc'" 合法字符串true

"abc"+"cde" 合法字符串true

等等...

目前楼主的方法

var regexString = /^["'](.*)["']$/gi

显然有很多情况都不能得到正确结果。

求教大家有好的解决方法或者知道有现成的npm轮子吗?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
高洛峰

有一个勉强可以解决方法就是用

function testStr(str){
    try{
        return (typeof eval(str)) === "string"
    }catch(e){
        //有错就返回false
        return false;
    }
    return true;
}
testStr("true")     //布尔值 false
testStr("\"true\"") //true
testStr("\'true\"") //false

不知是否有更好

PHPz
var regex = /^"([^"]|\\")*"$|^'([^']|\\')*'$/;
[
'"abc"',
"'abc'",
'a+"abc"',
'"a"+b+\'c\'',
'""abc""',
"'\"abc\"\"",
"'\"abc\"'",
'"\'abc\'"'
].forEach(function(str) {
  console.log(str, !!regex.exec(str));
});

再复杂就不适合纯正则了, 可能撸个interpreter更单纯

黄舟

根据你的描述,我总结出以下规则:

  • 引号一定要成对匹配

  • 两个子字符串之间仅能用+连接(空白字符除外)

我写了个状态机:

const SINGLE = "'";
const DOUBLE = '"';
const EMPTY  = '';

function testStr (str) {
  let state = EMPTY;
  let counter = 1;
  
  for (let i = 0; i < str.length; ++i) {
    let ch = str[i];
    
    switch (ch) {
      case "'": 
        if (state === EMPTY) {
          state = SINGLE;
          if (counter !== 1) return false;
          counter = 0;
        } else if (state === SINGLE) 
            state = EMPTY;
        break;
      case '"':
        if (state === DOUBLE) 
          state = EMPTY;
        else if (state === EMPTY) {
          state = DOUBLE;
          if (counter !== 1) return false;
          counter = 0;
        }
        break;
      default:
        if (state !== EMPTY || /\s/.test(ch)) break;
        if (counter === 1 || ch !== '+') return false;
        ++counter;
    }
  }
  
  return (state === EMPTY) && (counter === 0);
}

Update:卧槽理解错了。。请忽略以上代码(逃

const SINGLE = "'";
const DOUBLE = '"';
const EMPTY  = '';

function testStr (str) {
  let state = EMPTY;
  let escaping = false;
  
  for (let i = 0; i < str.length; ++i) {
    let ch = str[i];
    
    switch (ch) {
      case "'": 
          if (escaping) {
            escaping = false;
          break;
        }
        if (state === EMPTY) 
          state = SINGLE;
        else if (state === SINGLE) 
            state = EMPTY;
        break;
      case '"':
          if (escaping) {
            escaping = false;
          break;
        }
        if (state === DOUBLE) 
          state = EMPTY;
        else if (state === EMPTY)
          state = DOUBLE;
        break;
      case '\\':
          escaping = true;
        break;
    }
    
    if (state === EMPTY && i < str.length - 1) return false;
  }
  
  return (state === EMPTY);
}
ringa_lee

可以用 JSON 展开要处理的变量,失败则不是合法字符串,成功则进一步判断解开后的值类型即可。

需要额外处理一下前后的单引号,因为合法的 JSON 字符串必须用双引号。

更新:

可以尝试结合 eval 和 String 构造器检查

eval(toCheck) === String(toCheck)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号