public static Address parseDynamicName(AddressFactory factory, String name) {

		// assume dynamic names will never start with an underscore
		if (name.startsWith(UNDERSCORE)) {
			return null;
		}

		String[] pieces = name.split(UNDERSCORE);
		if (pieces.length < 2) { // if we have less than two pieces, then this is not a dynamic name.
			return null;
		}

		String addressOffsetString = pieces[pieces.length - 1];

		AddressSpace space = findAddressSpace(factory, pieces);
		if (space == null) {
			space = factory.getDefaultAddressSpace();
		}

		// Only consider address values which meet the minimum padding behavior
		if (addressOffsetString.length() < MIN_LABEL_ADDRESS_DIGITS) {
			return null;
		}

		/**
		 * If we are dealing with segmented addresses, then the address is really composed of the
		 * last two pieces.
		 */
		if (space instanceof SegmentedAddressSpace) {
			addressOffsetString = pieces[pieces.length - 2] + ':' + addressOffsetString;
		}

		try {
			return space.getAddress(addressOffsetString);
		}
		catch (AddressFormatException e) {
			// return null instead
		}
		return null;
	}
Parse a dynamic name and return its address or null if unable to parse.
@param factory address factory
@param name the dynamic label name to parse into an address.
@return address corresponding to symbol name if it satisfies possible dynamic naming
or null if unable to parse address fro name
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/symbol/SymbolUtilities.java