无法在Android上的Java中创建Article Spinner正则表达式?

时间:2014-10-07 05:58:35

标签: java php android regex

我看了How to create article spinner regex in Java?
从字符串“This {script | string}生成{on page | texts {1. | 2!| 3?}}”
需要随机化:
此脚本将在第1页生成。

这个脚本在第2页生成!

这个脚本在第3页生成? 或
第1页上生成此字符串。
或者......
这是可以工作的PHP代码:

function textGenerator($text)
   {
   static $result;
   if (preg_match("/^(.*)\{([^\{\}]+)\}(.*)$/isU", $text, $matches))
      {
      $p = explode('|', $matches[2]);
      foreach ($p as $comb)
         textGenerator($matches[1].$comb.$matches[3]);
      }
   else
      {
      $result[] = $text;
      return 0;
      }
   return array_values(array_unique($result));
   }
$string = "This {script|string} to generate {on page|texts {1.|2!|3?}}"

我在Java中这样做:

String str = new String("This {script|string} to generate {page|texts {1.|2!|3?}}");
mTextView.setText(generateSpun(str));
public String generateSpun(String text){
        String spun = text;
        Pattern reg = Pattern.compile("^(.*)\\{([^\\{\\}]+)\\}(.*)$");
        Matcher matcher = reg.matcher(spun);
        while (matcher.find()){
           spun = matcher.replaceFirst(select(matcher.group()));
        }
        return spun;
    }
    private String select(String m){
        String[] choices = m.split("\\|");
        Random random = new Random();
        int index = random.nextInt(choices.length - 1);
        return choices[index];
    }

返回以下内容:“此{script”或“2!”或“文本{1。” 我怎样才能做到正确?
谢谢!

1 个答案:

答案 0 :(得分:0)

这里有一些问题:

    如果可以找到匹配项,则
  1. "^(.*)\\{([^\\{\\}]+)\\}(.*)$"将匹配整个字符串,然后调用没有组号的matcher.group()将获取与整个正则表达式匹配的字符串(在本例中为整个字符串) )并将其提供给您的select函数。

    为此,您只需要匹配{}及其内部的任何内容"\\{([^{}]+)\\}",并获取{}内的内容(位于捕获组1中)并将其提供给{ {1}}

    select
  2. Random.nextInt(int)“返回伪随机,均匀分布的Pattern reg = Pattern.compile("\\{([^{}]+)\\}"); ... while (matcher.find()) { spun = matcher.replaceFirst(select(matcher.group(1))); 介于0(含)和指定值(不包括)”(强调我的)。 / p>

    你应该写int。否则,永远不会选择最后一个选择。

  3. int index = random.nextInt(choices.length);分配给替换值不会更改spun使用的字符串。您需要重置匹配器以使用Matcher中的新字符串,如Matcher.replaceFirst(String)的文档中所述:

      

    调用此方法会更改此匹配器的状态。如果要在进一步的匹配操作中使用匹配器,则应首先重置它。

    您通过调用Matcher.reset(CharSequence)重置匹配器的状态并告诉它使用spun中的新字符串

    spun