开发者

Regex PatternRepository pattern on BlackBerry 5 - how to ignore case

I hope this title makes sense - I need case-insensitive regex matching on BlackBerry 5.

I have a regular expression defined as:

    public static final String SMS_REG_EXP = "(?i)[(htp:/w\\.)]*cobiinteractive\\.com/[\\w|\\%]+";

It is intended to match "cobiinteractive.com/" followed by some text. The preceding (htp:w.) i开发者_如何学编程s just there because on my device I needed to override the internal link-recognition that the phone applies (shameless hack).

The app loads at start-up. The idea is that I want to pick up links to my site from sms & email, and process them with my app.

I add it to the PatternRepository using:

    PatternRepository.addPattern(
        ApplicationDescriptor.currentApplicationDescriptor(),
        GlobalConstants.SMS_REG_EXP,
        PatternRepository.PATTERN_TYPE_REGULAR_EXPRESSION,
        applicationMenu);
  • On the os 4.5 / 4.7 simulators and on a Curve 8900 device (running 4.5), this works.
  • On the os 5 simulators and the Bold 9700 I tested, app fails to compile the pattern with an IllegalArgumentException("unrecognized character after (?").

I have also tried (naively) to set the pattern to "/rockstar/i" but that only matches the exact string - this is possibly the correct direction to take, but if so, I don't know how to implement it on the BB.


How would I modify my regex in order to pick up case insensitive patterns using the PatternRepository as above?

PS: would the "correct" way be to use the [Cc][Oo][Bb][Ii]2... etc pattern? This is ok for a short string, but I am hoping for a more general solution if possible?


Well not a real solution for the general problem but this workaround is easy, safe and performant:

As your dealing here with URLs and they are not case-sensitive...
(it doesn't matter if we write google.com or GooGLE.COm or whatever)

The most simple solution (we all love KISS_principle) is to do first a lowercase (or uppercase if you like) on the input and than do a regex match where it doesn't matter whether it's case-sensitive or not because we know for sure what we are dealing with.


Since nobody else has answered this question relating to the PatternRepository class, I will self-answer so I can close it.

One way to do this would be to use a pattern like: [Cc][Oo][Bb][Ii]2[Nn][Tt][Ee][Rr][Aa][Cc][Tt][Ii][Vv][Ee]... etc where for each letter in the string, you put 2 options. Fortunately my string is short.

This is not an elegant solution, but it works. Unfortunately I don't know of a way to modify the string passed to PatternRepository and I think the crash when using the (?i) modifier is a bug in BB.


Use the port of the jakarta regex library: https://code.google.com/p/regexp-me/

If you use unicode support, it's going to eat memory, but if you just want case insensitive matching, you simply need to pass the RE.MATCH_CASEINDEPENDENT flag when you compile your regex.

new RE("yourCaseInsensitivePattern", RE.MATCH_CASEINDEPENDENT | OTHER_FLAGS)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜