解析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 ... 
随机推荐
- [codeforces724E]Goods transportation
			[codeforces724E]Goods transportation 试题描述 There are n cities located along the one-way road. Cities ... 
- POJ 1273 Drainage Ditches【图论,网络流】
			就是普通的网络流问题,想试试新学的dinic算法,这个算法暑假就开始看国家集训队论文了,之前一直都只用没效率的EK算法,真正学会这个算法还是开学后白书上的描述:dinic算法就是不断用BFS构建层次图 ... 
- 同步OR异步?WebFlux开发真的比Servlet开发要快?顺便再科普下CompletableFuture
			在看下文之前,先给大家科普一点基础知识 Runable:线程任务类接口,没有返回值 Callable:与上面的不同就是有返回值 Executor:定义了线程池执行任务的接口,不过只定义了Runable ... 
- [USACO13NOV]空荡荡的摊位Empty Stalls
			题目描述 Farmer John's new barn consists of a huge circle of N stalls (2 <= N <= 3,000,000), numbe ... 
- BZOJ3926 (后缀自动机)
			BZOJ3926 诸神眷顾的幻想乡 Problem : 给一个n个节点的树(n<=10^5), 每个点有一种颜色(c<=10), 询问所有点对之间路径组成字符串的种类.保证叶子节点小于等于 ... 
- poj2689素数问题
			打算重新刷一下数论题,忘了很多了,水平也很差,此题入手就不顺了,刷了一个早上,只是一个简单 的素数应用罢了.题意:找出区间长度不超过10^6的最近的素数和最远的素数(相邻的), 算法:数在int范围内 ... 
- oc温习七:结构体与枚举
			结构体和枚举都是一种存储复杂的数据.结构体是用户自定义的一种类型,不同类型的集合. 1.结构体的创建及使用 定义结构体类型 struct MyDate { int year; int month; i ... 
- HDU 6395  分段矩阵快速幂     HDU 6386   建虚点+dij
			http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) Me ... 
- Sudoku---hdu2676(数独DFS)
			http://poj.org/problem?id=2676 递归深搜 #include<stdio.h> #include<string.h> #include<alg ... 
- Eclipse中Maven运行项目时在Console中无日志出现的问题解决
			这是由于工作空间损坏造成的,比如重装JDK后,或者重装Maven后这些问题.解决方法如下: 1.删除现有工作空间,重新选择一个新的. 2.重置Workspece. 3.可能是Maven版本太新导致的, ... 
