【问题标题】:Parsing a string into different variable types将字符串解析为不同的变量类型
【发布时间】:2017-11-20 02:59:42
【问题描述】:

这里的编程相对较新,所以如果这是相当基本的,我深表歉意。

我正在尝试将字符串行转换为不同类型的实际变量。 我的输入是以下格式的文件:

 double d1, d2 = 3.14, d3;
 int a, b = 17, c, g;
 global int gInt = 1;
 final int fInt = 2;
 String s1, s2 = "Still with me?", s3;

此时这些行都是字符串。我希望从字符串中提取变量并接收实际变量,以便我可以使用和操作它们。

到目前为止,我已经尝试过使用正则表达式,但我在这里磕磕绊绊。很想知道这是怎么可能的。 我想制作一个通用的类型格式,例如:

 public class IntType{
      boolean finalFlag;
      boolean globalFlag;
      String variableName;

      IntType(String variableName, boolean finalFlag, boolean globalFlag){
      this.finalflag = finalFlag;
      this.globalFlag = globalFlag;
      this.variableName = variableName;
      }
 }

为每个变量类型创建一个新的包装器。

通过使用和操作,我想比较我创建的包装器并检查重复声明等。

但我不知道我是否走在正确的道路上。

注意:忽略不正确的格式(即末尾没有“;”等)

【问题讨论】:

  • 我不会对这类事情使用正则表达式,而是会使用专门为这类工作构建的工具,我认为您正在寻找的是词法分析器,尽管我我不确定,因为我不做这项工作。虽然我再次确定正则表达式不是要走的路。
  • 每个字符串行是否遵循可重复的格式?如果是,是哪一个?给出输入的样本。否则,如何知道值是否必须分配给特定类型?例如 double 和 int 都可能适合 2
  • 也许ANTLR 是您正在寻找的。同样,我不是该领域的专家,这就是为什么我没有发布答案而是发表评论。
  • @davidxxx 是的。它遵循声明变量时所期望的格式。但是,每行可能有不同的数量。
  • @HovercraftFullOfEels 更大的问题是我正在尝试制作一个程序来确定某个 sjava 文件是否可以正常运行。这意味着我需要检查变量和方法是否重复创建。变量和方法名称很好,范围正确打开和关闭等')方法很容易,但提取变量及其类型完全是另一回事,这对我来说很难弄清楚。 (sjava 文件声明变量以及“执行” if 和 while 并且能够调用方法)。

标签: java string parsing variables


【解决方案1】:

虽然其他人说这是不可能的,但实际上是。然而,它有点深入到 Java 中。只需搜索java dynamic classloading。例如这里: Method to dynamically load java class files

它允许您在运行时动态加载 java 文件。但是,您当前的输入看起来不像一个 java 文件,但可以通过使用一个小的包装器类将其包装为一个 java 文件,例如:

public class CodeWrapper() {
    // Insert code from file here
}

在将资源加载为类之前,您可以通过简单的文件或文本操作来完成此操作。

加载类后,您可以通过reflection 访问其变量,例如通过

Field[] fields = myClassObject.getClass().getFields();

这允许您访问可见性修饰符、变量的类型、名称、内容等。

当然,这种方法假定您的代码实际上是有效的 java 代码。 如果不是并且您正在尝试确认是否是,您可以尝试加载它。如果失败,则无效。

【讨论】:

  • 谢谢。我会马上调查的。希望它会有所帮助。
【解决方案2】:

我没有使用 Java 的经验,但据我所知,不可能使用任何语言的文件实际创建变量。您需要创建某种列表对象,该对象可以容纳可变数量的某种类型的项目。然后你可以从文件中读取值,解析成你想要的类型,然后保存到对应类型的列表中。

编辑:

如果我是你,我会尽可能改变我的文件布局。然后它看起来像这样:

1 2 3 4 //1 int, 2 floats, 3 booleans and 4 strings
53
3.14
2.8272
true
false
false
#etc.

在伪代码中,您将阅读如下:

string[] input = file.Readline().split(' ');    // Read the first line and split on the space character
int[] integers = new int[int.Parse(input[0])]   // initialise an array with specefied elements
 // Make an array for floats and booleans and strings the same way
while(not file.eof) // While you have not reached the end of the file
{
     integers.insert(int.Parse(file.ReadLine())) // parse your values according to the size which was given on the first line of the file
}

如果您无法更改文件布局,那么您将不得不进行一些智能字符串拆分以从文件中提取值,然后创建某种动态数组,当您向其中添加更多值时该数组会调整大小。

更多编辑:

根据您的评论:

您需要先拆分“=”字符。从拆分的前半部分开始,您需要搜索一个类型,从后半部分开始,您可以在“,”上再次拆分以查找所有值。

【讨论】:

  • 这就是我编写第二个代码块时的目标。但是,我不知道如何有效地提取名称和值。我想我可以将正则表达式用于 a = #(somenumber) 的格式假设这是一个 int 类型,我的模式将是: [A-Za-z]+(\\s)?=(\\s)?[ 0-9]+ 但我不确定如何有效地使用它并从中提取价值。
  • 很遗憾,我无法更改格式。我希望阅读代码文件并检查它们是否能正常运行。我无法更改代码的输入类型,因为它不会运行。
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 2023-01-13
  • 1970-01-01
  • 2015-03-19
  • 2015-02-06
  • 2019-07-24
  • 1970-01-01
相关资源
最近更新 更多