跑步时:
preg_split("/MapAttempt /", $subject)
在给定的输入字符串上:
MapAttempt TASK_TYPE="CLEANUP" TASKID="task_201307250256_0001_m_000320" TASK_ATTEMPT_ID="attempt_201307250256_0001_m_000320_0" START_TIME="1374702854132" TRACKER_NAME="tracker_wsmex3:ip6-localhost/127\.0\.0\.1:43273" HTTP_PORT="50060" .
MapAttempt TASK_TYPE="CLEANUP" TASKID="task_201307250256_0001_m_000320" TASK_ATTEMPT_ID="attempt_201307250256_0001_m_000320_0" TASK_STATUS="SUCCESS" FINISH_TIME="1374702864491" HOSTNAME="/default-rack/wsmex3" STATE_STRING="cleanup" COUNTERS="{(FileSystemCounters)(FileSystemCounters)[(FILE_BYTES_WRITTEN)(FILE_BYTES_WRITTEN)(21559)]}{(org\.apache\.hadoop\.mapred\.Task$Counter)(Map-Reduce Framework)[(PHYSICAL_MEMORY_BYTES)(Physical memory \\(bytes\\) snapshot)(95113216)][(SPILLED_RECORDS)(Spilled Records)(0)][(CPU_MILLISECONDS)(CPU time spent \\(ms\\))(690)][(COMMITTED_HEAP_BYTES)(Total committed heap usage \\(bytes\\))(200998912)][(VIRTUAL_MEMORY_BYTES)(Virtual memory \\(bytes\\) snapshot)(1214373888)]}
我收到了所需的数组,但还有一个额外的空索引,为什么?
还有为什么要运行:
preg_split("/MapAttempt .* \./", $subject)
返回空数组?
答案 0 :(得分:1)
你有2个问题。
获得额外空索引的原因是因为第一个MapAttempt前面有一个空字符串。
preg_split('/A/', 'xAyAz');
会导致
array('x', 'y', 'z')
,而
preg_split('/A/', 'AyAz');
导致
array ('', 'y', 'z')
就像上面的例子中一样,它给出了数组第一个元素中第一个描绘符之前的所有内容 - 但那里没有任何内容,所以它给你一个空字符串。
对于您的第二个问题,您要求将$ subject除以以下内容:
字符串" MapAttempt"然后是一个空格,后跟0或更多的空格,后跟一个空格,后跟一段时间。
第二个问题是第一个问题的一个稍微复杂的例子。您的正则表达式旨在匹配主题中的整个第一行。因此,您根据$ subject中出现 1st 的内容拆分。因此,你得到了描述符之前的内容(自从描述符在开头匹配时为空字符串),然后没有第一行打印,因为它全部包含在描述符中(就像preg_split(' / A /&#) 39;,...)并没有在返回的数组中给出" A"然后它会在描绘符之后(整个第2行)提供所有内容。
(如果这解决了您的问题,请标记为答案。我试图获得足够的声望点,以便我可以投票!谢谢......)