解析javascript变量
//add by tim
//提供解析javascript 脚本的变量集合
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class VariableScript
{
public static void TestJavaScript()
{
System.Diagnostics.Debug.WriteLine("在所有变量后加[i]");
VariableScript _VariableScript = new VariableScript();
_VariableScript.JavaScript = "aaa1/(a+b)+abc1+1000*(a+ccc)hh%222(999+999)";
System.Diagnostics.Debug.WriteLine(_VariableScript.JavaScript);
List<PartElement> list = _VariableScript.Variables;
list.ForEach(m =>
{
if (m.IsVariable)
{
m.ElementString = m.ElementString + "[i]";
}
})
;
string strData = _VariableScript.ToString();
System.Diagnostics.Debug.Write(strData);
}
char[] _ScriptChar;
/// <summary>
/// 脚本分解出来的char集合
/// </summary>
public char[] ScriptChar
{
get {
if (_ScriptChar == null)
{
_ScriptChar = _JavaScript.ToCharArray();
}
return _ScriptChar;
}
}
string _JavaScript;
/// <summary>
/// 用户输入的脚本javascript
/// </summary>
public string JavaScript
{
get {
return _JavaScript;
}
set {
_JavaScript = value;
}
}
List<PartElement> _Variables;
/// <summary>
/// 解析后的变量集合
/// </summary>
public List<PartElement> Variables
{
get {
if (_Variables == null)
{
_Variables = new List<PartElement>();
StringBuilder _StringBuilder = new StringBuilder();
for(int i=0;i<ScriptChar.Length;i++)
{
CharProperty _CharProperty = new CharProperty(this.JavaScript,i);
if (_CharProperty.IsVariablePart)
{
_StringBuilder.Append(_CharProperty.MyChar);
if (ScriptChar.Length == i + 1)
{
PartElement _PartElement = new PartElement();
_PartElement.IsVariable = true;
_PartElement.ElementString = _StringBuilder.ToString();
_Variables.Add(_PartElement);
}
}
else
{
if (_StringBuilder.Length > 0)
{
PartElement _PartElement = new PartElement();
_PartElement.IsVariable = true;
_PartElement.ElementString = _StringBuilder.ToString();
_Variables.Add(_PartElement);
}
PartElement _PartElement1 = new PartElement();
_PartElement1.IsVariable = false;
_PartElement1.ElementString = _CharProperty.MyChar.ToString();
_Variables.Add(_PartElement1);
_StringBuilder.Clear();
}
}
}
return _Variables;
}
}
/// <summary>
/// Variables集合的转换成字符串
/// </summary>
/// <returns></returns>
public override string ToString()
{
StringBuilder _Builder = new StringBuilder();
Variables.ForEach(m=>_Builder.Append(m));
return _Builder.ToString();
}
/// <summary>
/// 构造函数
/// </summary>
public VariableScript()
{
}
}
/// <summary>
/// 解析时对应的每一个字符属性
/// </summary>
class CharProperty
{
public string JavaScript;
public int CharIndex;
public char MyChar
{
get {
return JavaScript[CharIndex];
}
}
string optionString = @"+-*/%() \r\n";
public bool IsVariableEnd//变量的结尾
{
get
{
bool result = false;
if (IsVariablePart)
{
if(CharIndex+1<JavaScript.Length)
{
char tempChar=JavaScript[CharIndex+1];
if (optionString.Contains(tempChar))//是特殊的字符,不是变量的一部分
{
result=true;
}
}
if (CharIndex + 1 == JavaScript.Length)
{
result = true;
}
}
return result;
}
}
public bool IsVariablePart
{
get {
bool result = false;
if(Char.IsLetter(MyChar))
result = true;
if (Char.IsDigit(MyChar))
{
for (int i = CharIndex-1; i >=0; i--)
{
char tempChar = JavaScript[i];
if (Char.IsLetter(tempChar))//是字母,认为是变量的一部分
{
result = true;
break;
}
if (optionString.Contains(tempChar))//是特殊的字符,不是变量的一部分
{
result = false;
break;
}
}
}
return result;
}
}
public CharProperty(string pScript, int pCharIndex)
{
this.JavaScript = pScript;
this.CharIndex = pCharIndex;
}
}
/// <summary>
/// 解析出来的每一个集合
/// </summary>
class PartElement
{
public string ElementString;
public bool IsVariable=false;
public override string ToString()
{
return ElementString;
}
}
}
解析javascript变量的更多相关文章
- JavaScript变量提升和函数声明预解析
1.首先理解函数作用域 在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用域的.也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的.而如果该变量是 ...
- javascript变量的作用域
javascript变量的作用域 基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能由多个值组成的对象 讲一个值赋值给变量时,javascript解析器首先要确定是基本类型 ...
- javascript变量声明 及作用域
javascript变量声明提升(hoisting) http://openwares.net/js/javascript_declaration_hoisting.html 可能要FQ一下 java ...
- JavaScript 变量作用域
一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...
- 【转】javascript变量声明 及作用域
javascript变量声明提升(hoisting) javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 先看 ...
- 六天玩转javascript:javascript变量与表达式(1)
说明 本系列属于进阶系列,语常用语法等不在本系列介绍范围之内. 在我刚开始做一个程序员并开发项目的时候,我总是喜欢使用开发语言的各种特性,每次m$发布新版C#的时候我总是会把开发者预览版下好,亲自体验 ...
- 深入浅出 JavaScript 变量、作用域和内存 v 0.5
本文主要从原理入手分享变量和作用域的相关知识,最后结合本文所分享知识,再次深入了解下闭包的运行原理. 主要参考<JS高级程序设计> <JS权威指南> <高性能 JS> ...
- JavaScript快速入门(二)——JavaScript变量
变量声明 JavaScript的变量声明分为显式声明跟隐式声明. 显式声明 即带var关键字声明,例如 var example = example; 要注意JavaScript里面声明的关键字只有fu ...
- 深度解析javascript中的浅复制和深复制
原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ...
随机推荐
- CodeForces230A
题目大意: 一个打恐龙的游戏,有初始体力s,和恐龙n只,然后输入n只恐龙的体力xi,和击杀它得到的奖励体力yi,只有自身体力大于恐龙体力时才能进行击杀,击杀恐龙的顺序可以不定 这题运用到了贪心的思想, ...
- 2016 Multi-University Training Contest 4 solutions BY FZU
1001 Another Meaning 对于这个问题,显然可以进行DP: 令dp[i]表示到i结尾的字符串可以表示的不同含义数,那么考虑两种转移: 末尾不替换含义:dp[i - 1] 末尾替换含义: ...
- Codeforces Round #296 (Div. 2) D. Clique Problem [ 贪心 ]
传送门 D. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- msp430项目编程02
msp430中项目---液晶1602显示 1.液晶1602工作原理 2.电路原理说明 3.代码(静态显示) 4.代码(动态显示) 5.项目总结 msp430项目编程 msp430入门学习
- csu - 1659 Graph Center(最短路)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1659 题意是找一个图的中心,图的中心定义是某一个点到其他点的最大距离最小,如果有多个排序输出. 注 ...
- 纯Java Web项目下的Session共享方案收集(待实践)
1.使用filter方法存储 这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简单容易控制. 可以使用memcached-session-filter 官方网 ...
- linux的shell的until循环举例说明
执行脚本: sh login.sh user,其中user为第一个参数 如下所示,如果用户‘user’登录,'who | grep "$1"'为true,until循环结束,程序继 ...
- 【转】ubuntu 下安装mongodb php 拓展的方法
按照上面的方法安装成功之后,写一个 mongodb 的php测试脚本,用来测试是否可以 正确连接上mongodb ,并查询结果. 参考:http://php.net/manual/en/class.m ...
- CentOS 6.x ELK(Elasticsearch+Logstash+Kibana)
CentOS 6.x ELK(Elasticsearch+Logstash+Kibana) 前言 Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案, ...
- Linux 的 Socket IO 模型
前言 之前有看到用很幽默的方式讲解Windows的socket IO模型,借用这个故事,讲解下linux的socket IO模型: 老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系. 他 ...