Thanks, Fraser. Of course...<br><br>If you need to escape a backslash such that the regular expression itself contains a backslash at a certain point, then you need to double it up. For example to match the backslash character itself, you need to use "[\\]", but to encode other escape chars directly that CMake knows about, you only need one. (Just as you only need one to put the real "\n" character into the string in the first place.<br>
<br>This code shows that "Matches2" contains your expected results:<br><br><br>cmake_minimum_required(VERSION 2.8)<br><br>set(contents "Hello\nWorld!")<br>message("contents='${contents}'")<br>
<br>string(REGEX MATCHALL "Hello[\\r\\n\\t ]*World!" matches ${contents})<br>message("Matches1:")<br>foreach(match ${matches})<br> message("match='${match}'")<br>endforeach()<br><br>
string(REGEX MATCHALL "Hello[\r\n\t ]*World!" matches ${contents})<br>message("Matches2:")<br>foreach(match ${matches})<br> message("match='${match}'")<br>endforeach()<br><br><br><br>
<div class="gmail_quote">On Mon, Jan 10, 2011 at 5:38 PM, Fraser Hutchison <span dir="ltr"><<a href="mailto:fraser.hutchison@googlemail.com">fraser.hutchison@googlemail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div bgcolor="#ffffff" text="#000000">
I think if you remove the double "\\" it should work, i.e. use:<br>
<br>
<code>string (REGEX MATCHALL
"TEST_?F?\\([A-Za-z_0-9]+,[\r\n\t\\\\]*[A-Za-z_0-9 ]+\\)"
found_tests ${contents})</code><br>
<br>
Cheers,<br><font color="#888888">
<br>
Fraser.</font><div><div></div><div class="h5"><br>
<br>
<br>
<br>
<br>
On 1/10/2011 5:04 PM, Ben Medina wrote:
<blockquote type="cite">
<pre>It doesn't seem to work:
cmake_minimum_required (VERSION 2.8)
set (contents "Hello\nWorld!")
message ("${contents}")
string (REGEX MATCHALL "Hello[\\r\\n\\t ]*World!" matches ${contents})
message ("Matches:")
foreach (match ${matches})
message ("${match}")
endforeach ()
This produces no matches. If you replace "\n" with " " in the contents
string, then you get a match.
Thanks,
Ben
On Fri, Jan 7, 2011 at 12:18 PM, David Cole <a href="mailto:david.cole@kitware.com" target="_blank"><david.cole@kitware.com></a> wrote:
</pre>
<blockquote type="cite">
<pre>It should work.
But I'm pretty sure we don't recognize "\s" for white space. Try "[
\\t\\n\\r]" instead of \\s.
But..... watch out for white space after "(" and before ")" too. You might
miss some lines if they have spaces there.
On Fri, Jan 7, 2011 at 2:55 PM, Ben Medina <a href="mailto:ben.medina@gmail.com" target="_blank"><ben.medina@gmail.com></a> wrote:
</pre>
<blockquote type="cite">
<pre>I need to parse a C++ file for Google Test macros. (I'm aware the
GTEST_ADD_TESTS provided by FindGtest.cmake, but I need the test list
for my own purposes). I had been using a regex similar to the one in
GTEST_ADD_TESTS to match tests:
string (REGEX MATCHALL "TEST_?F?\\([A-Za-z_0-9 ,]+)\\)" found_tests
${contents})
But this doesn't work when the test is split onto two lines, like this:
TEST(SampleTest,\
MultilineTest)
So, I've been trying to build a regex that will match tests split onto
multiple lines. This should work:
string (REGEX MATCHALL "TEST_?F?\\([A-Za-z_0-9
]+,[\\s\\\\]*[A-Za-z_0-9 ]+\\)" found_tests ${contents})
After the comma, the regex should greedily match all whitespace
(including newlines) via the "\\s" and backslashes via the "\\\\"
(Note that all special characters are escaped). This works in other
regex engines, but fails in CMake.
Is this possible in CMake, or do I need to use another tool?
Here is my test file (named tests.cpp):
TEST(SampleTest, SingleLineTest)
TEST(SampleTest,\
MultilineTest)
TEST_F(SampleTest, SingleLineFixtureTest)
TEST_F(SampleTest,\
MultilineFixtureTest)
And my CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
file (READ "tests.cpp" contents)
string (REGEX MATCHALL "TEST_?F?\\([A-Za-z_0-9
]+,[\\s\\\\]*[A-Za-z_0-9 ]+\\)" found_tests ${contents})
message ("Found tests:")
foreach (test ${found_tests})
message ("${test}")
endforeach ()
Thanks,
Ben
_______________________________________________
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a>
Visit other Kitware open-source projects at
<a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a>
Please keep messages on-topic and check the CMake FAQ at:
<a href="http://www.cmake.org/Wiki/CMake_FAQ" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a>
Follow this link to subscribe/unsubscribe:
<a href="http://www.cmake.org/mailman/listinfo/cmake" target="_blank">http://www.cmake.org/mailman/listinfo/cmake</a>
</pre>
</blockquote>
<pre></pre>
</blockquote>
<pre>_______________________________________________
Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a>
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a>
Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ" target="_blank">http://www.cmake.org/Wiki/CMake_FAQ</a>
Follow this link to subscribe/unsubscribe:
<a href="http://www.cmake.org/mailman/listinfo/cmake" target="_blank">http://www.cmake.org/mailman/listinfo/cmake</a>
</pre>
</blockquote>
</div></div></div>
</blockquote></div><br>