Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Matching parentheses with Regular Expressions

Reply
Thread Tools

Matching parentheses with Regular Expressions

 
 
James
Guest
Posts: n/a
 
      07-04-2008
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.

What am I doing wrong? Thanks, Alan
 
Reply With Quote
 
 
 
 
James
Guest
Posts: n/a
 
      07-04-2008
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 does not make sense to me.

I`m trying to match text of the form (example):

\\GOLLY\Process(java)\% Processor Time

Thanks, Alan
 
Reply With Quote
 
 
 
 
Stefan Ram
Guest
Posts: n/a
 
      07-04-2008
James <(E-Mail Removed)> writes:
>private static final Pattern java_proc = Pattern.compile("\(java\)");


private static final Pattern java_proc = Pattern.compile("\\(java\\)");

 
Reply With Quote
 
Joshua Cranmer
Guest
Posts: n/a
 
      07-04-2008
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
 
Reply With Quote
 
James
Guest
Posts: n/a
 
      07-04-2008
Thank you.

I have one last remaining problem. The full data I`m working with,
in CSV format, looks like this:

"(PDH-CSV 4.0) (Eastern Daylight Time)(240)","\\GOLLY\Memory\%
Committed Bytes In Use","\\GOLLY\Process(java)\% Processor Time"

I want to match on

\\GOLLY\Process(java)\

so I can replace it.

The regular expression

\\\\{2}.+\\\\Process\\(java\\).

matches, but it matches too much of it:


\\GOLLY\Memory\% Committed Bytes In Use","\\GOLLY\Process(java)\

How can I get it to only match the part I want?

Thanks again, Alan
 
Reply With Quote
 
Joshua Cranmer
Guest
Posts: n/a
 
      07-04-2008
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
 
Reply With Quote
 
Arved Sandstrom
Guest
Posts: n/a
 
      07-04-2008
"James" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> 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.
>
> What am I doing wrong? Thanks, Alan


Double backslash your pattern: \\(java)\\

AHS


 
Reply With Quote
 
Roedy Green
Guest
Posts: n/a
 
      07-04-2008
On Thu, 3 Jul 2008 18:12:55 -0700 (PDT), James
<(E-Mail Removed)> wrote, quoted or indirectly quoted someone
who said :

> private static final Pattern java_proc = Pattern.compile("\(java
>\)");


It gets complicated because you have both Java and regex escape
quoting.

See http://mindprod.com/jgloss/regex.html#QUOTING

--

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com
 
Reply With Quote
 
shakah
Guest
Posts: n/a
 
      07-04-2008
On Jul 3, 9:52 pm, Joshua Cranmer <(E-Mail Removed)> 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[)]
 
Reply With Quote
 
Mark Space
Guest
Posts: n/a
 
      07-04-2008
shakah wrote:
> On Jul 3, 9:52 pm, Joshua Cranmer <(E-Mail Removed)> 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`)";

String myRegex = PATTERN.replace("`", "\\" );
System.out.println( myRegex );

Result:

\\{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.

Just thinking out loud....


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Regexp, matching only the content within parentheses Emil Kampp Ruby 11 03-26-2011 10:18 AM
Regular expressions - matching strings sconeek@gmail.com Java 2 04-04-2006 02:48 PM
Re: Matching of optional parts in regular expressions Markus Elfring Python 1 07-08-2004 04:03 PM
matching curly braces and regular expressions Dustin D. Perl 0 08-26-2003 11:18 PM
Add custom regular expressions to the validation list of available expressions Jay Douglas ASP .Net 0 08-15-2003 10:19 PM



Advertisments