1

输入示例

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

基本上,我在处理一些更复杂的正则表达式命令时遇到了麻烦。我发现使用正则表达式的大多数代码都非常简单,但如果我能熟练使用它,我可以在很多地方使用它。你会看看我正在尝试做的那种东西,看看你能不能转换其中的任何一种?

  1. 在大括号“(”和“)”之间排列单词或单词。
  2. 排列新行后面的第一个单词,以 xor 四个空格结尾,然后是右大括号“)”,以及一个空格和一个左大括号“(”,以及文档中的第一个单词,直到一个空格和一个左大括号“(” .
  3. 在任何带有分号的行上,排列以分号分隔的单词。获取最后一个分号之后的一个或多个单词,但不获取换行符或四个连续空格之后的单词。以字符串“tabulations:”开头的行中的单词不应包含在此数组中,即使以字符串“tabulations:”开头的行带有分号。如果新行以右大括号结尾,则 ")" 位于包含分号的行之前,而不是以数组的 "tabulations" "no alternates" 开头。
  4. 在以字符串“old style:”开头的行上获取冒号之后和换行符之前的一个或多个单词。如果新行以右括号结尾,“)”出现在“制表:”开始行之前,则将“no old style”添加到数组中,而不是。
  5. 与 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。

4

1 回答 1

1

这是家庭作业吗?这些说明(1-5)对我来说没有任何意义,只要你有理由在学术追求之外做任何事情。似乎您不仅对正则表达式而且对 PHP 也很陌生。正如@Howard 指出的那样,我们不会为你做你的工作。

除此之外,如果您需要正则表达式的帮助,我将非常乐意提供帮助;但是,这似乎并不是您最需要帮助的地方。

因此,关于您的问题,我可以为您提供以下信息:

3)“在任何带分号的行上,将分号分隔的单词进行数组化。
获取最后一个分号之后的一个或多个单词,但不获取换行符或四个连续空格之后的单词。-> 简单:按换行符 (\n)

以字符串 "tabulations:" 开头的行中的单词不应包含在此数组中,即使以字符串 "tabulations:" 开头的行上有分号。-> 这有点棘手。首先,正则表达式用于分号但不是冒号。这很可能必须由两个单独的正则表达式处理:首先是“制表:”,如果没有找到,则搜索分号。如果这个正则表达式成功,那么你可以用分号和现在您已经获得了制作所有数组的所有数据。

如果新行以右括号结尾,则“)”出现在包含分号的行之前,而不是以“制表”“无替代”开头的数组。” -> 这个我留给你来决定出于多种原因。;-)

于 2014-02-17T20:41:28.283 回答