天道酬勤,学无止境

GWT : how to get regex(Pattern and Matcher) working in client side

We're using GWT 2.03 along with SmartGWT 2.2. I'm trying to match a regex like below in client side code.

Pattern pattern = Pattern.compile("\\\"(/\d+){4}\\\"");
String testString1 = "[    \"/2/4/5/6/8\",    \"/2/4/5/6\"]";
String testString2 = "[  ]";

Matcher matcher = pattern.matcher(testString1);
boolean result = false;
while (matcher.find()) {
    System.out.println(matcher.group());
}

It appears that Pattern and Matcher classes are NOT compiled to Javascript by the GWTC compiler and hence this application did NOT load. What is the equivalent GWT client code so that I can find regex matches within a String ?

How have you been able to match regexes within a String in client-side GWT ?

Thank you,

评论

Just use the String class to do it! Like this:

String text = "google.com";
    if (text.matches("(\\w+\\.){1,2}[a-zA-Z]{2,4}"))
        System.out.println("match");
    else
        System.out.println("no match");

It works fine like this, without having to import or upgrade or whatever. Just change the text and regex to your liking.

Greetings, Glenn

Use GWT JSNI to call native Javascript regexp:

public native String jsRegExp(String str, String regex)
/*-{
    return str.replace(/regex/);  // an example replace using regexp 
    }
}-*/;

Perhaps you could download the RegExp files from GWT 2.1 and add them to your project?

http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/regexp/

Download GWT 2.1 incl source, add that directory somewhere in your project, then add the reference to the "RegExp.gwt.xml" using the <inherits> tag from your GWT XML.

I'm not sure if that would work, but it'd be worth a shot. Maybe it references something else GWT 2.1 specific which you don't have, but I've just checked out the code a bit and I don't think it does.

GWT 2.1 now has a RegExp class that might solve your problem:

// Compile and use regular expression
RegExp regExp = RegExp.compile(patternStr);
MatchResult matcher = regExp.exec(inputStr);
boolean matchFound = regExp.test(inputStr);

if (matchFound) {
Window.alert("Match found");
    // Get all groups for this match
    for (int i=0; i<=matcher.getGroupCount(); i++) {
        String groupStr = matcher.getGroup(i);
        System.out.println(groupStr);
    }
}else{
Window.alert("Match not found");
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 正则表达式和GWT(Regular Expressions and GWT)
    问题 我的问题是:在GWT中使用正则表达式是否有很好的解决方案? 例如,我对String.split(regex)的使用不满意。 GWT将代码转换为JS,然后使用该正则表达式作为JS正则表达式。 但是我不能使用Java Matcher或Java Pattern之类的东西。 但是我需要这些来进行组匹配。 有没有可能或图书馆? 我尝试了Jakarta Regexp,但是我遇到了其他问题,因为GWT不能模拟该库使用的Java SDK的所有方法。 我希望能够在客户端使用类似这样的东西: // Compile and use regular expression Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(inputStr); boolean matchFound = matcher.find(); if (matchFound) { // Get all groups for this match for (int i=0; i<=matcher.groupCount(); i++) { String groupStr = matcher.group(i); System.out.println(groupStr); } } 回答1 使用RegExp的相同代码可能是: //
  • 创建正则表达式匹配数组(Create array of regex matches)
    问题 在Java中,我试图将所有正则表达式匹配项返回到数组,但是似乎您只能检查模式是否匹配某些内容(布尔值)。 如何使用正则表达式匹配在给定字符串中形成所有与正则表达式匹配的字符串数组? 回答1 (如果可以假定Java> = 9,那么4castle的答案比下面的要好) 您需要创建一个匹配器,并使用它来迭代查找匹配项。 import java.util.regex.Matcher; import java.util.regex.Pattern; ... List<String> allMatches = new ArrayList<String>(); Matcher m = Pattern.compile("your regular expression here") .matcher(yourStringHere); while (m.find()) { allMatches.add(m.group()); } 此后, allMatches包含匹配项,如果确实需要一个数组,则可以使用allMatches.toArray(new String[0])获取一个数组。 由于Matcher.toMatchResult()返回当前组状态的快照,因此您还可以使用MatchResult编写帮助函数来循环匹配。 例如,您可以编写一个懒惰的迭代器让您执行 for (MatchResult
  • 自定义验证器 MVC + 验证客户端(custom validator MVC + validation client side)
    问题 我在 MVC 4 中创建了一个自定义验证器: public class FirstNameValidator : ValidationAttribute { private IRegistrationConfiguration _registrationConfiguration; public string Category { get; set; } public bool IsLocal { get; set; } public FirstNameValidator() { _registrationConfiguration = DependencyResolver.Current.GetService<IRegistrationConfiguration>(); } public FirstNameValidator(IRegistrationConfiguration registrationConfiguration) { _registrationConfiguration = registrationConfiguration; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value == null
  • GWT 中的字符串格式化程序(String Formatter in GWT)
    问题 如何在 GWT 中格式化我的字符串? 我做了一个方法 Formatter format = new Formatter(); int matches = 0; Formatter formattedString = format.format("%d numbers(s, args) in correct position", matches); return formattedString.toString(); 但它抱怨说 Validating newly compiled units [ERROR] Errors in 'file:/C:/Documents%20and%20Settings/kkshetri/workspace/MasterMind/MasterMind/src/com/kunjan/MasterMind/client/MasterMind.java' [ERROR] Line 84: No source code is available for type java.util.Formatter; did you forget to inherit a required module? 不包括格式化程序吗? 回答1 更新:在进一步查看此答案之前,请查看(并投票)Joseph Lust 下面的帖子。 根据这篇文章,似乎不包含格式化程序。 但是
  • 在Java正则表达式中,如何获取字符类,例如[az]以匹配-减号?(In a java regex, how can I get a character class e.g. [a-z] to match a - minus sign?)
    问题 Pattern pattern = Pattern.compile("^[a-z]+$"); String string = "abc-def"; assertTrue( pattern.matcher(string).matches() ); // obviously fails 字符类是否可以匹配“-”? 回答1 请勿在字符之间放置减号。 "[a-z-]" 回答2 转义减号 [a-z\\-] 回答3 在字符类[...]一个-经过特殊处理(如各种运营商),如果它是由双方字符包围。 这意味着,如果在字符类的开头或末尾包含- ,则将按字面意义对待(非特殊)。 因此,您可以使用正则表达式: ^[a-z-]+$ 或者 ^[-a-z]+$ 由于我们添加的-会按字面意义进行处理,因此无需对其进行转义。 尽管这样做不是错误。 另一种(不建议使用)的方法是在字符类中不包含- : ^(?:[a-z]|-)+$ 请注意,在这种情况下,括号不是可选的,例如| 的优先级很低,因此带括号: ^[a-z]|-+$ 将在串和一个或更多的开头匹配小写字母-结尾。 回答4 我将更具体地改写“不要放在字符之间”。 使破折号成为字符类中的第一个或最后一个字符。 例如,“ [-a-z1-9]”匹配小写字母,数字或破折号。 回答5 这对我有用 Pattern p = Pattern.compile("^[a-z\\
  • GWT中的客户端缓存(Client side caching in GWT)
    问题 我们有一个gwt-client,它从我们的服务器接收很多数据。 从逻辑上讲,我想在客户端缓存数据,以免服务器收到不必要的请求。 截止到今天,我已经让我的模型来处理数据缓存,但伸缩性不是很好。 这也成为一个问题,因为我们团队中的不同开发人员都开发了自己的“缓存”功能,从而使项目充满重复性。 我正在考虑如何实现一个“单入口”来处理所有缓存,而使模型对如何处理缓存一无所知。 有没有人在GWT中进行客户端缓存有任何经验? 有没有可以实施的标准方法? 回答1 我建议您研究gwt-presenter和CachingDispatchAsync 。 它为执行远程命令提供了一个入口点,因此是缓存的绝佳机会。 最近的博客文章概述了一种可能的方法。 回答2 您可能想看看命令模式; 雷·瑞安(Ray Ryan)在Google IO上就GWT的最佳做法进行了演讲,以下是成绩单:http://extgwt-mvp4g-gae.blogspot.com/2009/10/gwt-app-architecture-best-practices.html 他提出了通过操作和响应/结果对象使用命令模式的方法,这些对象被扔进服务代理和从服务代理抛出。 这些是封装要在客户端上执行的任何缓存的优秀对象。 摘录如下:“我有一个很好的货币单位用于实现缓存策略。可能是每当我两次看到相同的GET请求时
  • 在流上执行正则表达式(Performing regex on a stream)
    问题 我有一些大的文本文件,它们将执行连续匹配(只是捕获而不是替换)。 我认为将整个文件保存在内存中不是一个好主意,而是使用Reader 。 我对输入的了解是,如果有匹配项,则跨度不会超过5行。 所以我的想法是要有某种缓冲区,它只能保留这5行,或进行第一次搜索,然后继续。 但是它必须“知道”正则表达式匹配的结束位置,才能正常工作。 例如,如果比赛在第2行结束,则应从此处开始下一个搜索。 有可能以一种有效的方式来做这样的事情吗? 回答1 您可以使用Scanner和findWithinHorizo​​n方法: Scanner s = new Scanner(new File("thefile")); String nextMatch = s.findWithinHorizon(yourPattern, 0); 从findWithinHorizo​​n上的api: 如果horizo​​n是0,那么将忽略horizo​​n,此方法将继续在输入中搜索以查找指定的模式而不受限制。 在这种情况下,它可以缓冲搜索模式的所有输入。 注意:多行匹配时,您可能需要查看常量Pattern.MULTILINE和Pattern.DOTALL 。 回答2 Streamflyer能够在字符流上应用正则表达式。 请注意,我是它的作者。 回答3 正则表达式引擎的Java实现看起来不适合流处理。 我宁愿提倡另一种基于
  • 最佳的Java电子邮件地址验证方法是什么? [关闭](What is the best Java email address validation method? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 3年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 Java有哪些好的电子邮件地址验证库? 公用验证器是否有替代方案? 回答1 Apache Commons通常被称为一个可靠的项目。 不过请记住,如果您想确保它是真实的电子邮件,并且所有者希望在您的网站上使用它,则仍然必须向该地址发送一封验证电子邮件。 编辑:有一个错误,它对域的限制太严格,导致它不接受来自新TLD的有效电子邮件。 此错误已于03 / Jan / 15 02:48在commons-validator版本1.4.1中得到解决。 回答2 使用官方的Java电子邮件包是最简单的: public static boolean isValidEmailAddress(String email) { boolean result = true; try { InternetAddress emailAddr = new InternetAddress(email); emailAddr.validate(); } catch (AddressException ex) { result = false; } return
  • 解析表示化学反应的字符串并验证反应是否可能(Parsing a string that represents a chemical reaction and verify if the reaction is possible)
    问题 我必须编写一个程序,将用户的化学方程式作为输入,例如 12 CO2 + 6 H2O -> 2 C6H12O6 + 12 O2,然后观察两个站点上的原子量是否相同。 有什么方法可以轻松计算和解析吗? 例如: 12 CO2 + 6 H2O -> 2 C6H12O6 + 12 O2 12*2+6*2 -> 2*6+2*12+2*6+12*2 在这种情况下,应该有输出“假”。 这是我的代码,但实际上只是为了尝试一些东西: public static void main(String[] args) { Scanner s = new Scanner(System.in); List<String> list = new ArrayList<String>(); String input = ""; while (!(input.equals("end"))) { input = s.nextLine(); list.add(input); } list.remove(list.size() - 1); for (int i = 0; i < list.size(); i++) { int before = 0; int after = 0; String string = list.get(i); string = besserUmwandeln(string); System
  • 如何使用 Swing 代码中的正则表达式验证电子邮件 ID 的 JTextField?(How to validate a JTextField of email ID with a regex in swing code?)
    问题 我为这个验证尝试了很多,但我不知道在哪里放置以下代码 String expression="^[\\w\\-]([\\.\\w])+[\\w]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";. 请帮助我。 回答1 我希望这将有所帮助。 当您单击 SWING UI 上的提交按钮时,在 actionListener 中编写验证代码。 Emailvalidator emailValidator = new Emailvalidator(); if(!emailValidator.validate(emailField.getText().trim())) { System.out.print("Invalid Email ID"); /* Action that you want to take. For ex. make email id field red or give message box saying invalid email id. */ } 这是单独的类 EmailValidator import java.util.regex.Matcher; import java.util.regex.Pattern; public class EmailValidator { private Pattern pattern; private Matcher
  • 如何计算正则表达式的匹配数?(How can I count the number of matches for a regex?)
    问题 假设我有一个包含以下内容的字符串: HelloxxxHelloxxxHello 我编译一个模式以查找“ Hello” Pattern pattern = Pattern.compile("Hello"); Matcher matcher = pattern.matcher("HelloxxxHelloxxxHello"); 它应该找到三个匹配项。 我如何计算有多少场比赛? 我已经尝试了各种循环并使用matcher.groupCount()但是没有用。 回答1 matcher.find()找不到所有匹配项,只有下一个匹配项。 Java 9+的解决方案 long matches = matcher.results().count(); Java 8及更早版本的解决方案 您必须执行以下操作。 (从Java 9开始,有一个更好的解决方案) int count = 0; while (matcher.find()) count++; 顺便说一句, matcher.groupCount()是完全不同的东西。 完整的例子: import java.util.regex.*; class Test { public static void main(String[] args) { String hello = "HelloxxxHelloxxxHello"; Pattern pattern
  • 正则表达式模式拆分(Regex pattern for split)
    问题 我想解决这个问题。 ,逗号:分割字词 "双引号:字符串值(忽略特殊字符) []数组 例如: 输入: a=1,b="1,2,3",c=[d=1,e="1,2,3"] 预期输出: a=1 b="1,2,3" c=[d=1,e="1,2,3"] 但是我无法超越结果。 我写了下面的代码: String line = "a=1,b=\"1,2,3\",c=[d=1,e=\"1,11\"]"; String[] tokens = line.split(",(?=(([^\"]*\"){2})*[^\"]*$)"); for (String t : tokens) System.out.println("> " + t); 我的输出是: a=1 b="1,2,3" c=[d=1 e="1,11"] 我需要更改什么才能获得预期的输出? 我应该坚持使用正则表达式还是其他解决方案更灵活,更易于维护? 回答1 这个正则表达式可以达到目的: ",(?=(([^\"]*\"){2})*[^\"]*$)(?=([^\\[]*?\\[[^\\]]*\\][^\\[\\]]*?)*$)" 它的工作原理是在逗号后面添加一个用于匹配成对的方括号的预读-如果您位于方括号内,那么您当然不会在后面加上平衡的方括号。 这是一些测试代码: String line = "a=1,b=\"1,2,3\",c=[d=1,e=\
  • Canal 源码分析 —— filter 模块
    1 Filter模块简介 ​ filter模块用于对binlog进行过滤。在实际开发中,一个mysql实例中可能会有多个库,每个库里面又会有多个表,可能我们只是想订阅某个库中的部分表,这个时候就需要进行过滤。也就是说,parser模块解析出来binlog之后,会进行一次过滤之后,才会存储到store模块中。 ​ 过滤规则的配置既可以在canal服务端进行,也可以在客户端进行。 1.1 服务端配置 ​ 我们在配置一个canal instance时,在instance.properties中有以下两个配置项: 其中: ​ canal.instance.filter.regex用于配置白名单,也就是我们希望订阅哪些库,哪些表,默认值为.\..,也就是订阅所有库,所有表。 ​ canal.instance.filter.black.regex用于配置黑名单,也就是我们不希望订阅哪些库,哪些表。没有默认值,也就是默认黑名单为空。 ​ 需要注意的是,在过滤的时候,会先根据白名单进行过滤,再根据黑名单过滤。意味着,如果一张表在白名单和黑名单中都出现了,那么这张表最终不会被订阅到,因为白名单通过后,黑名单又将这张表给过滤掉了。 ​ 另外一点值得注意的是,过滤规则使用的是perl正则表达式,而不是jdk自带的正则表达式。意味着filter模块引入了其他依赖,来进行匹配。具体来说
  • Java PatternSyntaxException:字符串替换非法重复吗?(Java PatternSyntaxException: Illegal repetition on string substitution?)
    问题 我正在尝试编写一个将接受String的方法,检查它是否包含某些令牌(例如${fizz} , ${buzz} , ${foo}等),并将每个令牌替换为一个新的字符串从Map<String,String> 。 例如,如果我将此方法传递给以下字符串: “现在的$ {fizz}牛怎么样了。$ {buzz}的形状奇怪的$ {foo}。” 并且如果该方法查询了以下Map<String,String> : Key Value ========================== "fizz" "brown" "buzz" "arsonist" "foo" "feet" 然后,结果字符串将是: “现在是棕色的母牛。纵火犯的脚怪异。” 这是我的方法: String substituteAllTokens(Map<String,String> tokensMap, String toInspect) { String regex = "\\$\\{([^}]*)\\}"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(toInspect); while(matcher.find()) { String token = matcher.group(); // Ex: ${fizz}
  • 在Java正则表达式中组合白名单和黑名单(Combine whitelist and blacklist in java regex expression)
    问题 我在构造正则表达式时遇到问题,该正则表达式将允许使用完整的UTF-8字符范围,但不能包含2个字符:“ _”和“?” 因此,白名单是:^ [\ u0000- \ uFFFF],黑名单是:^ [^ _%] 我需要将它们组合成一个表达式。 我已经尝试了以下代码,但无法达到我希望的方式: String input = "this"; Pattern p = Pattern .compile("^[\u0000-\uFFFF]+$ | ^[^_%]"); Matcher m = p.matcher(input); boolean result = m.matches(); System.out.println(result); 输入:此实际输出:false 期望的输出:true 回答1 您可以在Java正则表达式中使用字符类的交集/减法来限制“通用”字符类。 字符类[az&&[^aeiuo]]与不是元音的单个字母匹配。 换句话说:它匹配单个辅音。 用 "^[\u0000-\uFFFF&&[^_%]]+$" 匹配_和%以外的所有Unicode字符。 有关Java正则表达式中可用的字符类交集/减法的更多信息,请参见Java™教程:字符类。 在OCPSoft Visual Regex Tester上进行的测试显示,将%添加到字符串时不匹配: 和Java演示: String input =
  • Tomcat为什么无法显示实际的堆栈跟踪?(Why is Tomcat unable to show the actual stack trace?)
    问题 使用GWT ,我已将服务器部署到Tomcat中。 这可以正常工作,但是当GWT引发异常时,弹出窗口会向客户端显示该异常的堆栈跟踪。 在开发模式下,这可以正常工作。 在Tomcat中,我得到以下堆栈跟踪。 为什么以及如何解决此问题? Unknown.Le(StackTraceCreator.java:168) Unknown.Jd(StackTraceCreator.java:421) Unknown.NT(Exception_FieldSerializer.java:16) Unknown.g1(SerializerBase.java:55) Unknown.b1(SerializerBase.java:112) Unknown.D$(AbstractSerializationStreamReader.java:119) Unknown.uAc(CustomException_FieldSerializer.java:39) Unknown.uBc(ServerSideException_FieldSerializer.java:12) Unknown.f1(SerializerBase.java:46) Unknown._0(SerializerBase.java:92) Unknown.D$(AbstractSerializationStreamReader.java
  • 如何使用正则表达式获取此 URL 参数(How can I get this URL parameter with regex)
    问题 String url = "mysite.com/index.php?name=john&id=432" 如何提取 id 参数 (432)? 它可以在 url 中的任何位置,并且 id 的长度也不同 回答1 您可以使用 HttpClient 包中的 Apache URLEncodedUtils: import org.apache.http.NameValuePair; import org.apache.http.client.utils.URLEncodedUtils; import java.nio.charset.Charset; import java.util.List; public class UrlParsing { public static void main(String[] a){ String url="http://mysite.com/index.php?name=john&id=42"; List<NameValuePair> args= URLEncodedUtils.parse(url, Charset.defaultCharset()); for (NameValuePair arg:args) if (arg.getName().equals("id")) System.out.println(arg.getValue()); } }
  • 为什么我的正则表达式在 RegexPlanet 和 regex101 上有效,但在我的代码中无效?(Why does my regex work on RegexPlanet and regex101 but not in my code?)
    问题 给定字符串#100=SAMPLE('Test','Test',我想提取100和Test 。我创建了正则表达式^#(\d+)=SAMPLE\('([\w-]+)'.*为此目的。 我在 RegexPlanet 和 regex101 上测试了正则表达式。 这两种工具都给了我预期的结果,但是当我尝试在我的代码中使用它时,我没有得到匹配。 我使用以下代码段来测试正则表达式: final String line = "#100=SAMPLE('Test','Test',"; final Pattern pattern = Pattern.compile("^#(\\d+)=SAMPLE\\('([\\w-]+)'.*"); final Matcher matcher = pattern.matcher(line); System.out.println(matcher.matches()); System.out.println(matcher.find()); System.out.println(matcher.group(1)); System.out.println(matcher.group(2)); 输出是 true false Exception in thread "main" java.lang.IllegalStateException: No match found
  • 序列化 java.lang.Throwable 与堆栈跟踪,导致链和相关堆栈跟踪(Serialize java.lang.Throwable along with stack trace, causes chain and related stack traces)
    问题 我正在编写GWT应用程序,我需要使用使用标准 Java 序列化机制的GWT RPC (就我而言)发送java.lang.Throwable 的实例(分别带有它的原因链和所有堆栈跟踪)。 问题是,当我从客户端传递以下示例异常时: java.lang.RuntimeException (message=null, stacktrace A) caused by java.io.IOException (message="Problems with io", stacktrace B) caused by java.lang.IllegalStateException (message="Some error text", stacktrace C), cause=null 在服务器上,我得到以下信息: java.lang.RuntimeException (message="java.io.IOException: Problems with io", stacktrace X) cause=this 其中, stacktrace X只是导致此异常在服务器上反序列化的位置的堆栈跟踪,即与原始堆栈跟踪 A、B 或 C 无关。因此堆栈跟踪信息与原因链一起丢失。 在阅读了精彩的文章 7 Tips for Exception Handling in GWT 后发现
  • 使用java创建正则表达式以从字符串中提取4位数字(Creating regex to extract 4 digit number from string using java)
    问题 嗨,我正在尝试构建一个正则表达式来使用 java 从给定的字符串中提取 4 位数字。 我尝试了以下方法: String mydata = "get the 0025 data from string"; Pattern pattern = Pattern.compile("^[0-9]+$"); //Pattern pattern = Pattern.compile("^[0-90-90-90-9]+$"); //Pattern pattern = Pattern.compile("^[\\d]+$"); //Pattern pattern = Pattern.compile("^[\\d\\d\\d\\d]+$"); Matcher matcher = pattern.matcher(mydata); String val = ""; if (matcher.find()) { System.out.println(matcher.group(1)); val = matcher.group(1); } 但它不能正常工作。 这该怎么做。 需要一些帮助。 谢谢你。 回答1 将您的模式更改为: Pattern pattern = Pattern.compile("(\\d{4})"); \d是数字, {}中的数字是您想要的数字。 回答2 如果您想以0025结尾, String