正则表达式转换这些不可能的正则表达式示例


Pro regex converting these impossible-to-regex examples?

输入示例

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:"开头的行上有分号。 如果以右大括号结尾的新行,则 "(" 位于包含分号的行之前,而不是以数组的"表格"无替代"开头。
  4. 获取以字符串"old style:"开头的行上冒号后面和换行符前面的一个或多个单词。 如果以右大括号结尾的新行 "(" 位于"tabbations:"-起始行之前,请改为在数组中添加"无旧样式"。
  5. 与 3 相同,但仅以字符串"tabulations:"开头的行除外。 如果以右大括号结尾的新行 "(" 位于"tabbations:"-起始行之前,请改为在数组中添加"无制表"。

我试图弄清楚如何通过PHP做到这一点,但如果有人可以用任何语言(尤其是php,C++,javascript或batch(处理这些请求,我会很高兴。 我也知道这些都很难表现出来,即使对于一个解谜爱好者来说也是如此。 因此,我承诺一旦获得任何完整答案的赏金,我就会获得 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";
}

我遇到的一些问题是我没有正确使用正则表达式。 我认为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。

这是家庭作业吗?这些指令(1-5(对我来说没有任何意义,就你什么时候有理由在学术追求之外做任何指令而言。您似乎不仅对正则表达式而且对 PHP 都是新手。正如@Howard指出的,我们不会为您做工作。

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

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

3("在任何带有分号的行上,用分号分隔的单词排列。
获取最后一个分号之后的一个或多个单词,但不获取换行符或四个连续空格后的单词。-> 简单:按换行符分解 ('(

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

如果以右大括号结尾的新行,则"位于包含分号的行之前,而不是以数组的"表格"无替代"开头。 -> 这个我留给你弄清楚,原因不止几个。;-(