如何模式匹配和转换字符串以生成某些输出?

时间:2018-02-28 10:57:52

标签: java arrays regex

下面的代码用于获取某种形式的输入,其中包括重要字符串之间和重要字符串之前和之后的大量空格,到目前为止,我已经能够过滤掉空白。准备好字符串后,我想要做的就是处理它。

以下是我可能获得的输入示例以及我想要的有利输出;

{
  "$schema": "http://json-schema.org/draft-6/schema#",

  "definitions": {
    "date": {
      "type": "string",
      "pattern": "^(0?[1-9]|[12][0-9]|3[01])\\-(0?[1-9]|1[012])\\-\\d{4}$"
    },
   },
   "properties": {
     "my_date": {"$ref": "#/definitions/dat"}
   }
}

注意域之前和之后的空格id,这个空格可以作为随机数量结束。

Input
+--------------+
                EDIT       example.mv                   Starter                                                 web-onyx-01.example.net.mv   

在输出中,重要位是域(示例。)和关键字(in)以及关键字(ns)和主机(web-onyx-01.example.net.mv。)之间的空格。 还要注意域和主机之后的句点("。")。另一部分是,如果它是一个(.mv)ccTLD,我们将不得不从字符串中删除该位,

我想要实现的是具有多行文本的转换,这意味着我想处理一堆无序的混乱字符串列表并批处理它们以产生干净的输出。

代码绝不是任何好的设计,但这至少是我想出的。注意:我是一名仍在学习编程的初学者。我希望您的建议是改进代码以及解决手头的问题,即将输入转换为所需的输出。

P.S输出用于DNS中的区域文件,因此错误可能非常棘手。

到目前为止,我的代码正在接受来自textarea的文本,并将文本输出到显示输出的另一个textarea。 只要数组长度为2和3,我的代码就可以工作,但是在任何更大的情况下都会失败。那么我如何能够动态处理输出到输出的大小与列表/数组可能在未来一样大?

Output
+--------------+

example.mv.            in      ns      web-onyx-01.example.net.mv.

1 个答案:

答案 0 :(得分:0)

根据我的理解你的问题,你有以下几种形式的输入:

whitespace[command]whitespace[domain]whitespace[label]whitespace[target-domain]whitespace

您希望将其转换为以下形式,以便很好地对齐多行:

[domain].     in    ns     [target-domain].

要做到这一点,我建议如下:

  1. 将您的输入拆分为多行
  2. 使用正则表达式检查行格式(例如,有效命令等)并提取域
  3. 分别存储两个域的最大长度
  4. 使用最大长度
  5. 构建字符串格式
  6. 遍历引用域并使用步骤4中定义的格式为该行构建字符串
  7. 示例:

     String input = "        EDIT        domain1.mv          Starter          example.domain1.net.mv     \n" +
                   "        DELETE        long-domain1.mv          Silver          long-example.long-domain1.net.mv     \n" +
                   "        ADD        short-domain1.mv          ADSL Business          ex.sdomain1.net.mv     \n";
    
    //step 1: split the input into lines
    String[] lines = input.split( "\n" );
    
    //step 2: build a regular expression to check the line format and extract the domains - which are the (\S+) parts
    Pattern pattern = Pattern.compile( "^\\s*(?:ADD|EDIT|DELETE)\\s+(\\S+)\\s+(?:Domain|Starter|Silver|Gold|ADSL Business|Pro|Lite|Standard|ADSL Multi|Pro Plus)\\s+(\\S+)\\s*$" );
    
    
    List<String[]> lineList = new LinkedList<>();
    int maxLengthDomain = 0;
    int maxLengthTargetDomain = 0;
    
    for( String line : lines )
    {
      //step 2: check the line
      Matcher matcher = pattern.matcher( line );
      if( matcher.matches() ) {
        //step 2: extract the domains
        String domain = matcher.group( 1 );
        String targetDomain = matcher.group( 2 );
    
        //step 3: get the maximum length of the domains
        maxLengthDomain = Math.max( maxLengthDomain, domain.length() );
        maxLengthTargetDomain = Math.max( maxLengthTargetDomain, targetDomain.length() );
    
        lineList.add( new String[] { domain, targetDomain } );
      }
    }
    
    //step 4: build the format string with variable lengths
    String formatString = String.format( "%%-%ds in      ns   %%-%ds", maxLengthDomain + 5, maxLengthTargetDomain + 2 );
    
    //step 5: build the output
    for( String[] line : lineList ) {
      System.out.println( String.format( formatString, line[0] + ".", line[1] + "." ) );
    }
    

    结果:

    domain1.mv.           in      ns   example.domain1.net.mv.           
    long-domain1.mv.      in      ns   long-example.long-domain1.net.mv. 
    short-domain1.mv.     in      ns   ex.sdomain1.net.mv.