正则表达式设计特殊字符串

时间:2019-04-18 20:13:15

标签: java regex

无法对以final Map<String, AtomicLong> gauges = new ConcurrentHashMap<>(); protected void submitMetric(String metricName, long value) { // If the gauge does not exist, create and register it gauges.computeIfAbsent(metricName, k -> { AtomicLong g = new AtomicLong(); mr.register(k, new Gauge<Long>() { @Override public Long getValue() { return g.get(); } }); return g; }).set(value); // Then set the value // Counters can be retrieved by name mr.counter(metricName + "Counter").inc(value); // Meters can be retrieved by name mr.meter(metricName + "Meter").mark(value); } 开始并以?结尾的字符串实现正则表达式 附加单引号或双引号。

例如:

;

我做了很多尝试,例如?abcdef; '?abcdef;' "?abcdef;" ,但没有成功。

测试代码段:

"^\\?([^;]+)\\;$"

3 个答案:

答案 0 :(得分:5)

您可以使用此正则表达式:

(["']?)\?.*;\1

用于Java:

final String pattern = "(['\"]?)\\?.*;\\1";

RegEx Demo

  • (["']?)可选 '"匹配并捕获到#1组
  • \1向后引用与#1组中相同的值

答案 1 :(得分:1)

您可以使用

final String text = "This is param-start ?abcdef; param-end";
final String patternString = "(['\"]?)\\?.*?;\\1";
final Pattern pattern = Pattern.compile(patternString, Pattern.DOTALL);
final Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
    System.out.println("Match found: " + matcher.group());
}
// => Match found: = ?abcdef;

请参见Java demoregex demo。 Regulex图:

enter image description here

注释

  • while (matcher.find())-遍历字符串中所有可能的匹配项
  • matcher.group()-访问匹配值。

正则表达式

  • (['"]?)-捕获组1:'"
  • \?-一个?字符
  • .*?-任意0个以上的字符,并尽可能少(该模式使用Pattern.DOTALL进行编译,因此它也可以跨换行符匹配)
  • ;-分号
  • \1-与第1组中捕获的值相同。

答案 2 :(得分:0)

您的描述中指出“以?开头;以;结束”,但是您的示例字符串不以分号结尾-以双引号结尾。

如果要允许字符串以单引号或双引号开头或结尾,则匹配项应为: ^['"]?\?[^;]+;\['"]?$