我看了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。”
我怎样才能做到正确?
谢谢!
答案 0 :(得分:0)
这里有一些问题:
"^(.*)\\{([^\\{\\}]+)\\}(.*)$"
将匹配整个字符串,然后调用没有组号的matcher.group()
将获取与整个正则表达式匹配的字符串(在本例中为整个字符串) )并将其提供给您的select
函数。
为此,您只需要匹配{}
及其内部的任何内容"\\{([^{}]+)\\}"
,并获取{}
内的内容(位于捕获组1中)并将其提供给{ {1}}
select
Random.nextInt(int)
“返回伪随机,均匀分布的Pattern reg = Pattern.compile("\\{([^{}]+)\\}");
...
while (matcher.find()) {
spun = matcher.replaceFirst(select(matcher.group(1)));
值介于0(含)和指定值(不包括)”(强调我的)。 / p>
你应该写int
。否则,永远不会选择最后一个选择。
将int index = random.nextInt(choices.length);
分配给替换值不会更改spun
使用的字符串。您需要重置匹配器以使用Matcher
中的新字符串,如Matcher.replaceFirst(String)
的文档中所述:
调用此方法会更改此匹配器的状态。如果要在进一步的匹配操作中使用匹配器,则应首先重置它。
您通过调用Matcher.reset(CharSequence)
重置匹配器的状态并告诉它使用spun
中的新字符串:
spun