/* * Copyright (c) 2019-2020. Developed by Hedgecode. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.hedgecode.chess.scanner.regex.type; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.hedgecode.chess.scanner.regex.AbstractRegexResult; import org.hedgecode.chess.scanner.regex.RegexMatcher; import org.hedgecode.chess.scanner.regex.RegexResult; import static org.hedgecode.chess.scanner.ChessHogScannerConstants.*; /** * RegexBlockFinder * * @author Dmitry Samoshin aka gotty */ public class RegexBlockFinder extends AbstractRegexResult implements RegexMatcher { private Pattern startPattern, endPattern; private boolean isMatch; private StringBuilder current; private String key; public RegexBlockFinder(String startMatch, String endMatch) { startPattern = Pattern.compile(startMatch); endPattern = Pattern.compile(endMatch); isMatch = false; current = new StringBuilder(); } @Override public void match(String input) { Matcher matcher = !isMatch ? startPattern.matcher(input) : endPattern.matcher(input); if (matcher.find()) { addCurrent(input); if (isMatch) { if (key != null) { add(key, current.toString()); } else { add(current.toString()); } current = new StringBuilder(); } else { key = matcher.groupCount() > 0 ? matcher.group(1) : null; } isMatch = !isMatch; } else { if (isMatch) { addCurrent(input); } } } private void addCurrent(String input) { current.append( input ).append( CRLF ); } @Override public RegexResult result() { return this; } }