The tilde doesn't have any special meaning in groovy or Java regular expressions. Groovy doesn't change the Java interpretation of regexs at all. All the special characters for are listed on the API reference page for java.util.regex.Pattern.
If you remove the \p{Alnum} character class and the escaped tilde, you can more easily see that ~ isn't being treated specially:
assert ("D" ==~ "(?:[^äöü~D~V~_])") == false
assert ("V" ==~ "(?:[^äöü~D~V~_])") == false
assert ("~" ==~ "(?:[^äöü~D~V~_])") == false
assert (" " ==~ "(?:[^äöü~D~V~_])") == true
I'd throw away these regexs. They're clearly wrong and obfuscated with extra characters. Word boundaries can be matched with \b and the \p{Alnum}äöü should almost certainly be \p{Alphabetic}\p{Digit} to handle unicode properly.
Groovy regular expressions have a ==~ operator which will determine if your string matches a given regular expression pattern.
Example
// ==~ tests, if String matches the pattern
assert "2009" ==~ /\d+/ // returns TRUE
assert "holla" ==~ /\d+/ // returns FALSE
Using this, you could create a regex matcher for your sample data like so:
// match 'somedata', followed by 0-N instances of ':somedata'...
String regex = /^somedata(:somedata)*$/
// assert matches...
assert "somedata" ==~ regex
assert "somedata:somedata" ==~ regex
assert "somedata:somedata:somedata" ==~ regex
// assert not matches...
assert "somedata:xxxxxx:somedata" !=~ regex
assert "somedata;somedata;somedata" !=~ regex
Read more about it here:
http://docs.groovy-lang.org/latest/html/documentation/#_match_operator
The negate regex match in Groovy should be
String regex = /^somedata(:somedata)*$/
assert !('somedata;somedata;somedata' ==~ regex) // assert success!