输入示例
vulture (wing)
tabulations: one leg; two legs; flying
father; master; patriarch
mat (box)
pedistal; blockade; pilar
animal belly (oval)
old style: naval
jackal's belly; jester slope of hill (arch)
key; visible; enlightened
基本上,我在处理一些更复杂的正则表达式命令时遇到了麻烦。我发现使用正则表达式的大多数代码都非常简单,但如果我能熟练使用它,我可以在很多地方使用它。你会看看我正在尝试做的那种东西,看看你能不能转换其中的任何一种?
- 在大括号“(”和“)”之间排列单词或单词。
- 排列新行后面的第一个单词,以 xor 四个空格结尾,然后是右大括号“)”,以及一个空格和一个左大括号“(”,以及文档中的第一个单词,直到一个空格和一个左大括号“(” .
- 在任何带有分号的行上,排列以分号分隔的单词。获取最后一个分号之后的一个或多个单词,但不获取换行符或四个连续空格之后的单词。以字符串“tabulations:”开头的行中的单词不应包含在此数组中,即使以字符串“tabulations:”开头的行带有分号。如果新行以右大括号结尾,则 ")" 位于包含分号的行之前,而不是以数组的 "tabulations" "no alternates" 开头。
- 在以字符串“old style:”开头的行上获取冒号之后和换行符之前的一个或多个单词。如果新行以右括号结尾,“)”出现在“制表:”开始行之前,则将“no old style”添加到数组中,而不是。
- 与 3 相同,但仅以字符串“tabulations:”开头的行除外。如果新行以右括号结尾,“)”出现在“制表:”开始行之前,则将“无制表”添加到数组中。
我试图弄清楚如何通过 PHP 做到这一点,但如果有人可以用任何语言(尤其是 php、C++、javascript 或批处理)处理这些请求,我会很高兴。我也知道这些都很难展示,即使对于一个拼图爱好者来说也是如此。因此,我保证一旦有任何完整答案的赏金可用,就会获得 100 分奖励积分。
-编辑-
我正在研究的第一个解决方案
好的,所以我正在研究的第一个解决方案是解决 3。我尝试在分号处换行,然后我希望逐行获取数据并进一步编辑它。
$input = file_get_contents('explode.txt');
foreach(explode("\n", $input) as $line){
$words = explode(';', $line);
foreach($words as $word){
echo $word;
}
}
基本上,查看输出,数据以它已经存在的相同格式结束,只是减去了分号。这不是很有用,我决定停下来。
我正在研究的第二个解决方案
这是基于这行代码:preg_match_all('/\;([^;]+)\}/', $myFile, $matches)
.
多亏了 EPB 和 fge,问题的第 1 部分现在有了一个可行的解决方案:
$myFile = file_get_contents('fakexample.txt');
function get_between($startString, $endString, $myFile){
//Escape start and end strings.
$startStringSafe = preg_quote($startString, '/');
$endStringSafe = preg_quote($endString, '/');
//non-greedy match any character between start and end strings.
//s modifier should make it also match newlines.
preg_match_all("/$startStringSafe(.*?)$endStringSafe/s", $myFile, $matches);
return $matches;
}
$list = get_between("(", ")", $myFile);
foreach($list[1] as $list){
echo $list."\n";
}
我遇到的一些问题是我没有正确使用 RegEx。我认为ArrayArray
返回问题是因为我没有封装 preg_match_all 函数,以便将 $matches 返回到私有函数。我仍然不确定。我也不确定是否应该使用该file_get_contents()
函数来读取文件。
第三次解决尝试
所以,我对如何处理这个问题有了初步的想法,我决定以自己的方式去做。同样,我从问题 1 开始,因为它看起来最简单。它有最少的例外
function find_between($input,$start,$end) {
if (strpos($input,$start) === false || strpos($input,$end) === false) {
return false;
} else {
$start_position = strpos($input,$start)+strlen($start);
$end_position = strpos($input,$end);
return substr($input,$start_position,$end_position-$start_position);
}
}
$myFile = file_get_contents('explode.txt');
$output = find_between($myFile,'(',')');
echo $output;
据我所知,这将起作用。我遇到的问题是递归。我试过foreach($output as $output){echo $output;}
了,但这给了我一个错误。对我来说似乎很明显,这是因为我没有递归,所以没有排列。我之所以停在这条路上,是因为有几个程序员告诉我,我注定要失败。所以,我目前正在重新研究解决方案 2。