Finding fragment in a string (a href) with regex - java

I have the following snipped:
What i want is just the someurl. However there are variations such as following:
<a target=blank href="$click_tracking_url$&landing_url=someurl" alt=""></a>
I had this regex but doesnt work for variations:
<a href=\".*?landing_url=(.*?)\">
how can i fix it or if there is an easier way to do it?

You did not match all the variations because you did not consider the attributes between href and <a. Try that instead:
Pattern p = Pattern.compile("<a[^>]+href=[\\'\\\"].+&landing_url=(.+?)[\\'\\\"]");

Related

Write a HTML tag as a String in Jsoup

I have an element like below;
<p> I am lost </p>`
I need to highlight "am" like below;
<p> I <mark style="background-color:#FFFF00;">am</mark> lost </p>
My code is like this.
String newText = "I <mark style=\"background-color:#FFFF00;\">am</mark> lost";
element.text(newText);
But when I print the element it looks like this.
<p>I <mark style="background-color:#FF0000;">am</mark> lost</p>
Are there any ways to force "<" and ">" characters to elements using Jsoup?
Instead of element.text(newText) you should use element.html(newText)

Regex pattern to identify attribute value

I have a source code file which I am trying to read using a automatic Regex processor Class in java.
Although I am unable to form a correct regex pattern to get the values if it appears multiple times in the line.
The input text is:
<input name="id" type="radio" bgcolor="<bean:write name='color'/>" value="<bean:write name='nameProp' property='nameVal'/>" <logic:equal name="checkedStatus" value="0">checked</logic:equal>>
And I want the matcher.find to output following terms:
<bean:write name='color'/>
<bean:write name='nameProp' property='nameVal'/>
Kindly help to form the regex pattern for this scenario.
Use this regex to find those terms:
<bean:write[^\/]*\/>
It will search for the words <bean:write and then everything up until a />
Use it like this:
List<String> matches = new ArrayList<>();
Matcher m = Pattern.compile("<bean:write[^\\/]*\\/>")
.matcher(inputText);
while (m.find()) {
matches.add(m.group());
}
Regex101 Tested
I caution you though with parsing HTML with regex. If you need anything more complicated than this, you should probably consider using an XML parser instead. See this famous answer.

Java get specific part of HTML

I'm looping through a load of HTML and I'm trying to just extract the parts I need.
I need to just get 'THISISTHEBITIWANT' from the html below.
<li class="aClass">
example
</li>
<li class="aClass">
example2
</li>
Each time I only want to get the 'THISISTHEBITIWANT' and the text in the link will change.
I've looked at string replace - but as I don't know what 'example' or 'example2' is going to be each time, I can only remove up until 'example/' at the moment.
This was my Java code:
html = inputLine.replace("<li class=\"aClass\"><a href=\"/example/", "");
If anyone could offer any advice, it would be much appreciated!
While the standard way for processing HTML would be to use an HTML parsing library, as the two comments suggest, if you are really only interested in getting the bit you want out, it may suffice to use a regular expression.
import java.util.regex.*;
public class Regular{
public static void main(String[] args) {
String original = "<li class=\"aClass\">\nexample2\n</li>";
Pattern mypattern = Pattern.compile("<li class=\"aClass\">\\s+<a href=\"example/([^\"]+)\"");
Matcher matcher = mypattern.matcher(original);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}

how to match string using regular expression

I have a string which contains multiple occurrences of the "<p class=a> ... </p>" where ... is different text.
I am using "<p class=a>(.*)</p>" regex pattern to split the text into chunks. but this is not working. what would be the correct regex for this?
P.S. the same regex pattern is working in iOS using NSRegularExpression but not working in android using Pattern.
To explain my problem more : i am doing the following
Pattern regex3 = Pattern.compile("(?s)<P Class=ENCC>(.*?)</P>", CASE_INSENSITIVE);
String[] result = p.split(str);
result array contains only 1 item and it is the whole string
and the following is a portion of the file that i am reading :
<BODY>
<SYNC Start=200>
<P Class=ENCC><i>Cerita, Watak, Adegan dalam</i><br/><i>Drama Ini Rekaan Semata-Mata.</i></P>
</SYNC>
<SYNC Start=2440>
<P Class=ENCC> </P>
</SYNC>
<SYNC Start=2560>
<P Class=ENCC><i>Kami Tidak Berniat</i><br/><i>Melukakan Hati Sesiapa.</i></P>
</SYNC>
<SYNC Start=4560>
<P Class=ENCC> </P>
</SYNC>
<SYNC Start=66160>
<P Class=ENCC>Hai kawan-kawan.<br/>Inilah bandaraya Banting.</P>
</SYNC>
UPDATE ::::
hi everybody, I have got the problem. the problem was actually with the encoding of the file that i was reading. the file was UTF-16 (Little Endian) encoded. that was causing the all problem of regex not working. i changed it to UTF-8 and everything started working .. thanx everybody for your support.
Parsing HTML with regular expressions is not really a good idea (reason here). What you should use in an HTML parser such as this.
That being said, your issue is most likely the fact that the * operator is greedy. In your question you just say that it is not working, so I think that your problem is because it is matching the first <p class=a> and the very last </p>. Making the regular expression non greedy, like so: <p class=a>(.*?)</p> (notice the extra ? to make the * operator non greedy) should solve the problem (assuming that your problem is the one I have stated earlier).
That being said, I would really recommend you ditch the regular expression approach and use appropriate HTML Parsers.
EDIT:
Now that you've posted the code and the text you're matching against, one thing immediately leaps to mind:
You're matching <p class..., but your string contains <P Class.... Regexes are case-sensitive.
Then, . does not match newlines. And it's quite likely that your paragraphs do contain newlines.
Therefore, try "(?si)<p class=a>(.*?)</p>". The (?s) modifier allows the dot to match newlines, too, and the (?i) modifier makes the regex case-insensitive.
The .* may match <. You can try :
<p class=a>([^<]*)</p>
I guess the problem is that your pattern is greedy. You should use this instead.
"<p class=a>(.*?)</p>"
If you have this string:
"<p class=a>fist</p><p class=a>second</p>"
Your pattern ("<p class=a>(.*)</p>") will match this
"<p class=a>fist</p><p class=a>second</p>"
While "<p class=a>(.*?)</p>" only matches
"<p class=a>fist</p>"

JSP Text Processing with Regex

I have a large number (>1500) of JSP files that I am trying to convert to JSPX. I am using a tool that will parse well-formed JSPs and convert to JSPX, however, my JSPs are not all well-formed :)
My solution is to pre-process the JSPs and convert untidy code so the tool will parse them correctly. The main problem I am trying to resolve is that of unquoted attribute values. Examples:
<INPUT id="foo" size=1>
<input id=body size="2">
My current regex for finding these is (in Java string format):
"(\\w+)=([^\"' >]+)"
And my replacement string is (in Java string format):
"$1=\"$2\""
This works well, EXCEPT for a few patterns, both of which involve inline scriptlets. For example:
<INPUT id=foo value="<%= someBean.method("a=b") %>">
In this case, my pattern matches the string literal "a=b", which I don't want to do. What I'd like to have happen is that the regex would IGNORE anything between <% and %>. Is there a regular expression that will do what I am trying to do?
EDIT:
Changed to title to clarify that I am NOT trying to parse HTML / JSP with regexes... I am doing a simple syntactic transformation to prepare the input for parsing.
If a sentence contains an arbitrary number of matching tokens such as double quotes, then this sentence belongs to a context-free language, which simply cannot be parsed with Regex designed to handle regular languages.
Either there could be some simplification assumptions (e.g. there are no unmatched double quotes and there is only a certain number of those etc.) that would permit the use of Regex, or your need to think about using (creating) a lexer/parser for a case of context-free language. ANTLR is a good tool for this.
Based on the assumption that there are NO unquoted attribute values inside the scriptlets, the following construct might work for you:
Note: this approach is fragile. Just for your reference.
import java.util.regex.*;
public class test{
public static void main(String args[]){
String s = "<INPUT id=foo abbr='ip ' name = bar color =\"blue\" value=\" <%= someBean.method(\" a = b \") %>\" nickname =box >";
Pattern p = Pattern.compile("(\\w+)\\s*=\\s*(\\w+[^\"'\\s])");
Matcher m = p.matcher(s);
while (m.find())
{
System.out.println("Return Value :"+m.group(1)+"="+m.group(2));
}
}
}
Output:
Return Value:id=foo
Return Value:name=bar
Return Value:nickname=box

Categories