private void searchRange(AddressRange range, FoundStringCallback callback,
			TaskMonitor monitor) {
		matchers.forEach(m -> m.reset());
		range = adjustRangeForAlignment(range);
		MemBuffer buf = new MemoryBufferImpl(program.getMemory(), range.getMinAddress());
		long length = range.getLength();
		for (int i = 0; i < length; i++) {
			if (monitor.isCancelled()) {
				return;
			}

			if (i % 1000 == 999) {
				monitor.incrementProgress(1000);
			}
			byte b = getByte(buf, i);
			for (ByteStreamCharMatcher matcher : matchers) {
				if (matcher.add(b)) {
					processSequence(callback, matcher.getSequence(), buf);
				}
			}
		}

		for (ByteStreamCharMatcher matcher : matchers) {
			if (matcher.endSequence()) {
				processSequence(callback, matcher.getSequence(), buf);
			}
		}

	}
Returns a new address set that is the intersection of the given set with the
desired memory block addresses (loaded or unloaded).
<p>
Note: This desired set of memory blocks is known by inspecting the 
{@link StringTableOptions#useLoadedBlocksOnly()} attribute set by the user. 

@param addressSet the address set to update
@param useLoadedBlocksOnly if true, only return addresses in loaded memory blocks
@return new the new address set
Ghidra/Features/Base/src/main/java/ghidra/program/util/string/AbstractStringSearcher.java