解析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 = @"+-*/%() ";


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;
}
}
}

原文地址:https://www.cnblogs.com/mingyongcheng/p/3439177.html