這很容易解決使用兩個正則表達式。適用於整體文本的第一個正則表達式匹配逗號分隔值的每個加括號列表。應用於每個先前匹配列表的第二個正則表達式匹配列表中的每個值。下面是有功能的PHP腳本,考慮具有多個列表的輸入文本,替換其值中的一個隨機選擇的每個列表:
<?php // test.php 20110425_0900
function substitute_random_value($text) {
$re = '/
# Match parenthesized list of comma separated words.
\( # Opening delimiter.
\s* # Optional whitespace.
\w+ # required first value.
(?: # Group for additional values.
\s* , \s* # Values separated by a comma, ws
\w+ # Next value.
)+ # One or more additional values.
\s* # Optional whitespace.
\) # Closing delimiter.
/x';
// Match each parenthesized list and replace with one of the values.
$text = preg_replace_callback($re, '_srv_callback', $text);
return $text;
}
function _srv_callback($matches_paren) {
// Grab all word options in parenthesized list into $matches.
$count = preg_match_all('/\w+/', $matches_paren[0], $matches);
// Randomly pick one of the matches and return it.
return $matches[0][rand(0, $count - 1)];
}
// Read input text
$data_in = file_get_contents('testdata.txt');
// Process text multiple times to verify random replacements.
$data_out = "Run 1:\n". substitute_random_value($data_in);
$data_out .= "Run 2:\n". substitute_random_value($data_in);
$data_out .= "Run 3:\n". substitute_random_value($data_in);
// Write output text
file_put_contents('testdata_out.txt', $data_out);
?>
的substitute_random_value()
函數調用PHP preg_replace_callback()
功能,它匹配和用列表中的一個值替換每個列表。它調用_srv_callback()
函數,隨機選取其中一個值並將其作爲重置值返回。
鑑於這種輸入測試數據(testdata.txt
):
((3 + 4) * 12) * (2, 3, 4, 5))
((3 + 4) * 12) * (12, 13))
((3 + 4) * 12) * (22, 23, 24))
((3 + 4) * 12) * (32, 33, 34, 35))
這裏是從腳本的一個例子的運行的輸出:
Run 1:
((3 + 4) * 12) * 13)
((3 + 4) * 12) * 22)
((3 + 4) * 12) * 35)
Run 2:
((3 + 4) * 12) * 3)
((3 + 4) * 12) * 12)
((3 + 4) * 12) * 22)
((3 + 4) * 12) * 33)
Run 3:
((3 + 4) * 12) * 3)
((3 + 4) * 12) * 12)
((3 + 4) * 12) * 23)
((3 + 4) * 12) * 32)
注意,該解決方案使用\w+
以匹配由 「字」 的字符,即,[A-ZA-Z0-9_]值。如果這不符合您的要求,可以輕鬆更改。
編輯:這裏是substitute_random_value()
功能的JavaScript版本:
function substitute_random_value(text) {
// Replace each parenthesized list with one of the values.
return text.replace(/\(\s*\w+(?:\s*,\s*\w+)+\s*\)/g,
function (m0) {
// Capture all word values in parenthesized list into values.
var values = m0.match(/\w+/g);
// Randomly pick one of the matches and return it.
return values[Math.floor(Math.random() * values.length)];
});
}
您正在使用什麼語言,解析這個? – ridgerunner 2011-04-25 14:53:40
AS3,所以雖然我很欣賞具體的答案,但我試着讓問題更一般。 – grey 2011-04-26 03:17:55
當提出正則表達式問題時,指定語言很重要,因爲每種語言都有不同的正則表達式能力(正確答案取決於這些能力)。例如,現在我知道您正在使用AS3(使用Javascript正則表達式「flavor」),實際上正確的答案是簡化的。看到我更新的答案。 – ridgerunner 2011-04-26 13:53:37