I`m trying to use regex to match/replace a word in parentheses. The regular expression
private static final Pattern java_proc = Pattern.compile("(java)");
does not work, because parentheses are treated as groupings.
Using "\" to designate the parentheses as literal characters does not work --- not sure why:
private static final Pattern java_proc = Pattern.compile("\(java \)");
I searched for and read a related post here, but it did not help. I seem to be having a different problem than they. Or I just don`t understand the post.
OK, I finally found the words about using double slashes in front of parentheses. So, now, why won`t the following regular expression pattern compile?
private static final Pattern java_proc = Pattern.compile("\\\\.+\ \Process\\(java\\)\\");
The error says:
java.lang.ExceptionInInitializerError Caused by: java.util.regex.PatternSyntaxException: Unknown character property name {r} near index 6 \\.+\Process\(java\)\ ^
James wrote: > OK, I finally found the words about using double slashes in front of > parentheses. So, now, why won`t the following regular expression > pattern compile?
> private static final Pattern java_proc = Pattern.compile("\\\\.+\ > \Process\\(java\\)\\");
> The error says:
> java.lang.ExceptionInInitializerError > Caused by: java.util.regex.PatternSyntaxException: Unknown character > property name {r} near index 6 > \\.+\Process\(java\)\ > ^
This is what the regex is seeing. Don't forget that `\' is also a metacharacter in regexes. So to match a '\' in regex requires you to use '\\\\', which causes the regex to see '\\', which is what it uses to match as a '\'. So the regex you're probably trying to compile: "\\\\{2}.+\\\\Process\\(java\\)\\\\" (The {2} is so that you don't have to type in 8 slashes)
-- Beware of bugs in the above code; I have only proved it correct, not tried it. -- Donald E. Knuth
In that case, you probably want this regex: \\\\{2}[^\\\\]+\\\\Process\\(java\\) -- Beware of bugs in the above code; I have only proved it correct, not tried it. -- Donald E. Knuth
> I`m trying to use regex to match/replace a word in parentheses. > The regular expression
> private static final Pattern java_proc = > Pattern.compile("(java)");
> does not work, because parentheses are treated as groupings.
> Using "\" to designate the parentheses as literal characters does > not work --- not sure why:
> private static final Pattern java_proc = Pattern.compile("\(java > \)");
> I searched for and read a related post here, but it did not > help. I seem to be having a different problem than they. Or I just > don`t understand the post.
On Jul 3, 9:52 pm, Joshua Cranmer <Pidgeo...@verizon.invalid> wrote:
> James wrote: > > The regular expression
> > \\\\{2}.+\\\\Process\\(java\\).
> > matches, but it matches too much of it:
> In that case, you probably want this regex: > \\\\{2}[^\\\\]+\\\\Process\\(java\\) > -- > Beware of bugs in the above code; I have only proved it correct, not > tried it. -- Donald E. Knuth
FWIW, you could avoid a little of the backslash escape mess by using single-char character classes, e.g.: Pattern.compile("[\\]{2}[^\\]+[\\]Process[(]java[)]") ; // ...outside of a Java string that'd be [\]{2}[^\]+ [\]Process[(]java[)]
shakah wrote: > On Jul 3, 9:52 pm, Joshua Cranmer <Pidgeo...@verizon.invalid> wrote: >> James wrote: >>> The regular expression >>> \\\\{2}.+\\\\Process\\(java\\).
>> > matches, but it matches too much of it:
>> In that case, you probably want this regex: >> \\\\{2}[^\\\\]+\\\\Process\\(java\\) >> -- >> Beware of bugs in the above code; I have only proved it correct, not >> tried it. -- Donald E. Knuth
> FWIW, you could avoid a little of the backslash escape mess > by using single-char character classes, e.g.: > Pattern.compile("[\\]{2}[^\\]+[\\]Process[(]java[)]") ; > // ...outside of a Java string that'd be [\]{2}[^\]+ > [\]Process[(]java[)]
You also might get rid of some of those backslashes by substituting another character, then using replace() on the string before compiling it.
final static String PATTERN = "``{2}.+``Process`(java`)";
It just makes things more readable. Using `, or %, or # in a string, then replace that character with \'s before compiling it as a regex can save your eyes.
Incidentally, I wonder if Sun could be convinced to add this themselves. Maybe add a new operator/keyword altogether. Like # introduces new keywords or operators. It's followed by the keyword or operator. This just allows Sun to make new keywords or operators, with out breaking any existing code. So #s might give us new string constatns. Let's say ' then means like a Unix shell string, where escaping is ignored.
String regex = #s'\\{2}.+\\Process\(java\)';
Would give that literal string, without the need to escape the backslashes. Easier for regex at least. Other types of flags besides ' could be introduced too. `,$,@,%,= might do the same thing, just use a different character as a string terminator, in case you want a ' to be part of the string. """ might introduce a "here-is" operator. Etc.